FrauenundInfo Geschrieben 16. Mai 2009 Geschrieben 16. Mai 2009 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 Zitieren
FrauenundInfo Geschrieben 16. Mai 2009 Autor Geschrieben 16. Mai 2009 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; } Zitieren
flashpixx Geschrieben 16. Mai 2009 Geschrieben 16. Mai 2009 (bearbeitet) 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 16. Mai 2009 von flashpixx Zitieren
Empfohlene Beiträge
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.