C :: Aufgabe #56

1 Lösung Lösung öffentlich

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

Lösungen:

vote_ok
von devnull (8870 Punkte) - 23.11.2014 um 17:03 Uhr
Das Programm ermittelt die gesuchte Zahl und gibt eine Tabelle der berechneten Primzahlfaktoren aus, deren Produkt die Zahl ergibt.
Quellcode ausblenden 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;
}