S
Slix1995
Gast
Hallo zusammen,
Ich habe ein kleines Programm zur Primfaktorzerlegung , dieses zerlegt eine beliebige Zahl in die möglichst kleinsten teiler(Primfaktoren) und möchte dies bzw. den Programmablauf besser verstehen, da wollte ich mal Fragen ob mir einer den Quellcode vielleicht etwas erklären könnte.
Der Code ist unten mit dabei würde mich über ein paar Antworten freuen!
Mit freundlichen Grüßen
Ein kleiner Programmieranfänger
Ich habe ein kleines Programm zur Primfaktorzerlegung , dieses zerlegt eine beliebige Zahl in die möglichst kleinsten teiler(Primfaktoren) und möchte dies bzw. den Programmablauf besser verstehen, da wollte ich mal Fragen ob mir einer den Quellcode vielleicht etwas erklären könnte.
Der Code ist unten mit dabei würde mich über ein paar Antworten freuen!
Mit freundlichen Grüßen
Ein kleiner Programmieranfänger
C:
#include <stdio.h>
#include <math.h>
#include <time.h>
unsigned long long kTeiler(unsigned long long n);
unsigned long long leseULongLong(char *string);
void prim(unsigned long long n);
int main(void)
{
unsigned long long n;
clock_t start, end;
start = clock();
while (n>0)
{
n = leseULongLong("Geben Sie eine natuerliche Zahl ein");
printf("Eingegeben wurde: %I64u \n", n);
if (n>1)
{
prim(n);
}
else if (n==1)
{
printf("1 = 1\n");
}
else
{
printf("Eingegebene Zahl kleiner 0: PROGRAMM-ENDE \n\n");
break;
}
}
end = clock();
printf("TIME: %.2f s\n", (double) (end - start) / CLOCKS_PER_SEC);
return 0;
}
void prim(unsigned long long n)
{
unsigned long long m;
m = kTeiler(n);
printf("%I64u = %I64u", n, m);
n = n/m;
while(n != 1)
{
m = kTeiler(n);
printf(" * %I64u", m);
n = n/m;
}
printf("\n");
}
unsigned long long kTeiler(unsigned long long n)
{
unsigned long long max, k;
if (n<4)
{
return n;
}
if (n%2 == 0)
{
return 2;
}
if (n%3 == 0)
{
return 3;
}
if (n%5 == 0)
{
return 5;
}
k=7;
max=sqrt(n)+1;
while(n%k != 0)
{
k=k+4;
if (n%k==0)
{
break;
}
k=k+2;
if (n%k==0)
{
break;
}
k=k+4;
if (n%k==0)
{
break;
}
k=k+2;
if (n%k==0)
{
break;
}
k=k+4;
if (n%k==0)
{
break;
}
k=k+6;
if (n%k==0)
{
break;
}
k=k+2;
if (n%k==0)
{
break;
}
k=k+6;
if(k > max)
{
k = n;
}
}
return k;
}
int flushStdin(void)
{
int c;
do
{
c = getchar();
//printf(":%d:\n",c); // Debug-Ausgabe
}
while(c != '\n' && c != EOF);
return c;
}
unsigned long long leseULongLong(char *string)
{
unsigned long long ein = 0;
printf("Eingabe >> %s: ", string);
while(scanf("%I64u",&ein) != 1)
{
if(flushStdin() != EOF)
{
printf("Erneute Eingabe >> %s: ", string);
}
else
{
printf(stderr, " Falscher Eingabewert!\n");
break;
}
}
return ein;
}