Zum Inhalt springen

Primfaktorzerlegung mit longlong???????


FrauenundInfo

Empfohlene Beiträge

Hallo ich habe folgendes Problem und zwar soll ich eine praktische Aufgabe in Informatik abgeben und das ist vorraussetzung um zur Prüfung zugelassen zu werden aber ich habe im moment gar keine Ahnung was ich machen soll :((( Als vorlage haben wir folgenden Quelltex, die primfaktorzerlegung soll in der funktion prim () erfolgen in der es wiederum die funktion kteiler für den kleinsten gemeinsamen teiler gibt und die ausgabe soll dann z.b. so aussehen 12= 2 * 2 * 3, hab noch die Aufgabenstellung in den Anhang gepackt, ich habe auch einen anderen Quelltext gefunden der genau das machen soll was mein Programm können soll, aber den versteh ich irgendwie nicht so wirklich! Ach ja effizient soll es auch noch sein, also die Berechnung soll nich so lang dauern!

#include <stdio.h>

/* Vorwärtsdeklarationen */

long long leseLongLong(char * string);

long long kTeiler(long long n);

void prim(long long n);

int main()

{

char * vorname = "Marcella"; /* Unbedingt anpassen */

char * nachname = "Seifert"; /* Unbedingt anpassen */

long long n = 1;

printf("Erste praktische Aufgabe von %s %s.\n", vorname, nachname);

// Zahlen in einer Schleife einlesen,

// Abbruch, wenn eingelesene Zahl kleiner gleich 0.

// Für jede eingelesene Zahl soll prim() aufgerufen werden!

while(n) {

n = leseLongLong("n");

}

return 0;

}

// Berechnet die Primfaktorzerlegung von n und

// gibt sie mit printf() aus!

void prim(long long n)

{

// TO DO

// Benutzen Sie die Funktion kTeiler() aus Übung 4!

}

Tausend mal Danke für eventuelle Hilfe :)

// ========================================================================

// Liest alle im Eingabepuffer vorhandenen Zeichen bis zum

// nächsten newline oder Datei-Ende (end of file, EOF) und

// gibt lediglich das letzte Zeichen zurück. Dadurch wird der

// Eingabepuffer geleert.

// Die oft gesehene Lösung

// fflush(stdin)

// ist nach ANSI-Standard unbestimmt.

int flushStdin(void)

{

int c;

do {

c = getchar();

//printf(":%d:\n",c); // Debug-Ausgabe

} while(c != '\n' && c != EOF);

return c;

}

// =====================================================

/* Gibt eingelesen Wert zurück

Vor der Eingabe wird der Wert von 'string' ausgegeben

Im Fehlerfall wird -1 zurückgegeben */

int leseLongLong(char *string)

{

long long ein = -1;

printf("Eingabe >> %s: ", string);

while(scanf("%lld",&ein) != 1){

if(flushStdin() != EOF){

printf("Erneute Eingabe >> %s: ", string);

} else {

fprintf(stderr, " Falscher Eingabewert!\n");

break;

}

}

return ein;

}

praktAufgabe1.pdf

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo hier ist der kteiler quelltext der in der funktion prim () implementiert werden soll aber irgendwie versteh ich jetzt nicht ganz den zusammenhang bzw wie ich die beiden quelltexte zusammenfügen soll sodass es ein funktionierendes Programm wird...und ideen wie man die laufzeit verkürzen kann hab ich auch nciht...

#include <stdio.h>

#include <math.h>

/* Vorwärtsdeklarationen */

long long kTeiler(long long n);

long long leseLongLong(char *string);

/* -------------------------------------------------------------------*/

int main()

{

long long n, res;

printf("Eine Eingabe kleiner gleich 0 beendet das Programm !\n");

do {

printf("\n-------------------------------------- \n");

n = leseLongLong("Geben Sie eine natürliche Zahl ein");

printf("Eingegeben wurde: %lld \n", n);

if(n > 0) {

res = kTeiler(n);

printf("Der kleinste Teiler (größer 1) von %lld ist %lld.\n", n, res);

} else {

printf("Eingegebene Zahl kleiner 0: PROGRAMM-ENDE \n\n");

}

} while(n > 0);

return 0;

}

/* -------------------------------------------------------------------*/

/* Return: Gibt den kleinsten Teiler > 1 von n zurück

* Annahme: n >= 1 (wird nicht geprüft)

*

* Folgerung: n == kTeiler(n) <=> n Primzahl oder n = 1

*/

long long kTeiler(long long n)

{

long long max, kteiler;

if(n < 4)

return n;

if(n % 2 == 0)

return 2;

if(n % 3 == 0)

return 3;

kteiler = 5;

max = sqrt(n);

while(n % kteiler != 0) {

kteiler += 2;

if(n % kteiler == 0){

break;

}

kteiler += 4;

if(kteiler > max)

kteiler = n;

}

return kteiler;

}

/// ========================================================================

// Liest alle im Eingabepuffer vorhandenen Zeichen bis zum

// nächsten newline oder Datei-Ende (end of file, EOF) und

// gibt lediglich das letzte Zeichen zurück. Dadurch wird der

int flushStdin(void)

{

int c;

do {

c = getchar();

//printf(":%d:\n",c); // Debug-Ausgabe

} while(c != '\n' && c != EOF);

return c;

}

// =====================================================

/* Gibt eingelesen Wert zurück

Vor der Eingabe wird der Wert von 'string' ausgegeben

Im Fehlerfall wird -1 zurückgegeben *

long long leseLongLong(char *string)

{

long long ein = -1;

printf("Eingabe >> %s: ", string);

while(scanf("%lld",&ein) != 1){

if(flushStdin() != EOF){

printf("Erneute Eingabe >> %s: ", string);

} else {

fprintf(stderr, " Falscher Eingabewert!\n");

break;

}

}

return ein;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo hier ist der kteiler quelltext der in der funktion prim () implementiert werden soll aber irgendwie versteh ich jetzt nicht ganz den zusammenhang bzw wie ich die beiden quelltexte zusammenfügen soll sodass es ein funktionierendes Programm wird...und ideen wie man die laufzeit verkürzen kann hab ich auch nciht...

Ich verstehe nicht was Du genau machen willst. Du sollst ein C oder C++ Programm schreiben, dass Dir sagt, ob eine Zahl prim ist oder nicht und wenn sie nicht prim ist, Dir die Primfaktorzerlegung liefert. Wenn Du nicht weißt wie man die Faktorzerlegung programmiert, dann empfehle ich diesen Artikel Primzahl ? Wikipedia

Es ist hilfreich, wenn Du Quelltext postest die Code-Tags des Editors zu verwenden, das ist definitiv lesbar, als dieses "fett geschriebene". Wenn es sich um mehrere Dateien handelt, dann schreibe dazu, welche Dateien es sind bzw. poste die einzelnen Dateien.

Wenn Du effiziente Algoithmen suchst für das Problem suchst, schaue in den http://www.nr.com/ nach, aber hier sei auch der Hinweis gegeben, es wird niemand Deine Aufgaben machen. Ich denke von einem FH Studenten/in kann man das schon erwarten

Ergänzung: Warum doppelt posten http://forum.fachinformatiker.de/c-c/127793-alternativquelltext-primfaktoren-steige.html Es sind unterschiedliche Codes, aber das gleiche Problem.

Phil

Bearbeitet von flashpixx
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...