C :: Aufgabe #56
1 Lösung
Finde die erste Zahl die durch alle Zahlen bis 30teilbar ist
Fortgeschrittener - C
von 96fabi
- 25.09.2014 um 09:01 Uhr
Gesucht wird die erste Zahl, die durch alle Zahlen bis 30 geteilt werden kann(1-30).
Zum Einstieg kann man erstmal die erste Zahl suchen , die durch alle Werte bis 20 geteilt werden kann.
Dieses ist 232792560
Zum Einstieg kann man erstmal die erste Zahl suchen , die durch alle Werte bis 20 geteilt werden kann.
Dieses ist 232792560
Lösungen:
Das Programm ermittelt die gesuchte Zahl und gibt eine Tabelle der berechneten Primzahlfaktoren aus, deren Produkt die Zahl ergibt.
C-Code
/* teiler.c : Berechnung der kleinsten Zahl, die durch
* alle ganzen Zahlen 1..N teilbar ist.
*/
#include <stdlib.h>
#include <stdio.h>
unsigned int prime_number[100];
unsigned int prime_factor[100];
int prime_count[100];
int nprime;
// Primzahl - Testfunktion
int isprime(uint number) {
int cdiv = 1; // Anzahl Teiler
uint div; // Teiler
for (div=2; div <= number/2; div++)
if (number % div == 0)
cdiv++;
return cdiv==1?1:0;
}
// Primzahlen 2 .. max ermitteln
void get_primes(uint max) {
unsigned int num;
nprime = 0;
for (num=2; num<=max; num++)
if (isprime(num)) {
prime_number[nprime] = num;
prime_count[nprime] = 0;
prime_factor[nprime] = 1;
nprime++;
}
}
// Primfaktorzerlegung einer Zahl
void factorize(uint number) {
unsigned int pnum;
unsigned int pfac = 1;
int ip=0, pcnt=0;
while (number > 1) {
pnum = prime_number[ip];
if (number % pnum == 0) {
pcnt++;
pfac *= pnum;
if (pcnt > prime_count[ip]) {
prime_count[ip] = pcnt;
prime_factor[ip] = pfac;
}
number /= pnum;
} else {
pcnt = 0;
pfac = 1;
ip++;
}
}
}
// Primzahl-Statistik der Berechnung
void show_primes() {
int i;
printf("\n%s %s %s\n", "Primzahl", "Häufigkeit", "Faktor");
for (i=0; i<nprime; i++)
printf("%4u %6d %6u\n", prime_number[i], prime_count[i], prime_factor[i]);
}
// Berechnung der gesuchten Zahl
unsigned long calc_zahl(int number) {
unsigned long prod = 1L;
int i,n;
for (n=2; n<=number; n++)
factorize(n);
for (i=0; i<nprime; i++)
prod *= prime_factor[i];
return prod;
}
// main
int main(int argc, char **argv) {
unsigned int number;
if (argc > 1) {
number = atoi(argv[1]);
get_primes(number);
printf("Die gesuchte Zahl lautet: %lu\n", calc_zahl(number));
show_primes();
} else
printf("Usage: teiler <größter Teiler>\n");
return 0;
}
