Zum Inhalt springen

Euklidischer Algorithmus (C)


dila

Empfohlene Beiträge

Ich bitte um Hilfe! Ich habe die Folgende Aufgabenstellung :

Ändern Sie die Implementierung des Euklidischen Algorithmus in rekursiven Stil um.

&

Implementieren Sie eine Funktion in der Programmiersprache C zur Berechnung von f(n)=n! , wobei f(0):=1 gilt. mittels rekursiven Aufrufes. Testen Sie ihre Funktion in einem Programm für die Werte n=10,0,-5,100.

Also ich habe schon ein Programm geschrieben, was auch sehr gut funktioniert ABER nur bei den Werten 10,0,-5. Bei der Zahl 100 kommt leider 0 raus, was natürlich falsch ist.

Das ist das , was ich geschrieben habe:

#include<stdio.h>

int factorial(int n)

{

if (n == 1)

return 1;

else

return n*factorial(n-1);

}

int main ()

{

int m;

int n;

printf("Zahl eingeben:");

scanf("%d", &m);

printf("m lautet %d\n",m);

printf("Zahl eingeben:");

scanf("%d", &n);

printf("n lautet %d\n",n);

return 0;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bitte verwende Code-Tags. Der Code sollte bei 0 und -5 einen Laufzeitfehler produzieren, denn beide Zahlen führen zu einer Endlosrekursion, bei 0 wäre die if-Bedingun im ersten Schritt false, geht somit in den else Zweig und dann steht dort 0*factorial(-1), factorial von -1 ist ebenfalls der else Zweig und liefert -1*factorial(-2), d.h. die Abbruchbedingung wird niemals für Werte < 1 erreicht.

Weiterhin wird Deine Funktion nirgends im Hauptprogramm aufgerufen, Du gibst lediglich die Zahlen aus, die Du auch einliest und das sind 2

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich habe schon ein Programm geschrieben, was auch sehr gut funktioniert ABER nur bei den Werten 10,0,-5.
Was gibt deine Funktion denn für -5 zurück? Die Fakultät ist ja nun nur für nichtnegative Zahlen definiert ;)

Bei der Zahl 100 kommt leider 0 raus, was natürlich falsch ist.
Das Problem ist, dass der richtige Wert viel zu groß ist, als dass er in einen int (oder irgendeinen anderen Ganzzahltyp) hineinpassen würde. Möglicherweise ist das das gewünschte Ergebnis des Tests. Du könntest auch mit Fließkommatypen rechnen, dort passen so große Werte eher hinein, allerdings auf Kosten der Genauigkeit.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Was gibt deine Funktion denn für -5 zurück? Die Fakultät ist ja nun nur für nichtnegative Zahlen definiert ;)

Das Problem ist, dass der richtige Wert viel zu groß ist, als dass er in einen int (oder irgendeinen anderen Ganzzahltyp) hineinpassen würde. Möglicherweise ist das das gewünschte Ergebnis des Tests. Du könntest auch mit Fließkommatypen rechnen, dort passen so große Werte eher hinein, allerdings auf Kosten der Genauigkeit.

Also für den Wert -5 kommt auch Null raus, und ich habe mir gedacht, dass es soweit richtig ist. Also für negative Zahlen rechnet das Programm den Wert niht aus. Ich weiß das bei meinem Programm 1-2 Ziffern fehlen, damit ich den Wert 100 Berechne.Aber was es genua ist weiss ich leider nicht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du könntest auch mit Fließkommatypen rechnen, dort passen so große Werte eher hinein, allerdings auf Kosten der Genauigkeit.

Wenn ich nicht irre, müsste ein long bzw long long die Fakultät von 100 darstellen können, damit sind keine Fließkommazahlen notwendig, da die Fakultät nur für positive Zahlen definiert ist, kann man einen unsigned Datentyp verwenden, so dass der Zahlenbereich durchaus passen müsste. Ein Fließkommatyp ist nur notwendig, wenn man die Fakultät durch die Stirlingformel approximiert

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also für den Wert -5 kommt auch Null raus, und ich habe mir gedacht, dass es soweit richtig ist.
Nein, das ist falsch. Die Fakultät ist für negative Zahlen nicht definiert. Da du aber beim Rückgabetyp int nicht "nichts" zurückgeben kannst, könntest du eine Fehlermeldung ausgeben oder das Programm abbrechen.

Ich weiß das bei meinem Programm 1-2 Ziffern fehlen, damit ich den Wert 100 Berechne.
Da dürfte erheblich mehr fehlen. Du benutzt int, das ist auf heute üblichen Systemen 32 Bit groß. Die größte damit darstellbare Zahl ist 2.147.483.647, das reich noch nicht einmal für 13!. Selbst wenn dein int 64 Bit hat, kommst du nur bis 20!. Deine Funktion liefert dafür zwar noch Ergebnisse, aber sie sind alle falsch.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Nein, das ist falsch. Die Fakultät ist für negative Zahlen nicht definiert. Da du aber beim Rückgabetyp int nicht "nichts" zurückgeben kannst, könntest du eine Fehlermeldung ausgeben oder das Programm abbrechen.

Da dürfte erheblich mehr fehlen. Du benutzt int, das ist auf heute üblichen Systemen 32 Bit groß. Die größte damit darstellbare Zahl ist 2.147.483.647, das reich noch nicht einmal für 13!. Selbst wenn dein int 64 Bit hat, kommst du nur bis 20!. Deine Funktion liefert dafür zwar noch Ergebnisse, aber sie sind alle falsch.

Oh super dann ist ja ziemlich alles falsch :D durch was kann ich denn int ersetzen? (tut mir Leid für die dumen fragen :( )

Link zu diesem Kommentar
Auf anderen Seiten teilen

Oh super dann ist ja ziemlich alles falsch :D durch was kann ich denn int ersetzen?
Vielleicht ist der Sinn dieser Aufgabe auch, dass dir die Grenzen der Wertebereiche der Datentypen bewusst werden.

Für 100! brauchst du einen Ganzzahltyp mit einer Größe von über 500 Bit. Es gibt spezielle Bibliotheken, die das können, aber ich glaube nicht, dass das der Sinn der Aufgabe ist.

Du kannst wie gesagt auch einen Fließkommatyp wie double benutzen. Hätte den zusätzlichen Vorteil, dass du bei negativem Argument die Möglichkeit hättest, im Rückgabewert ein ungültiges Ergebnis anzuzeigen. Allerdings wäre der Wert dann nicht genau. Fließkommatypen erkaufen sich die großen Wertebereiche durch verringerte Genauigkeit.

P.S.: Was ist ein "Schleifentyp"? Das habe ich noch nie gehört.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielleicht ist der Sinn dieser Aufgabe auch, dass dir die Grenzen der Wertebereiche der Datentypen bewusst werden.

Für 100! brauchst du einen Ganzzahltyp mit einer Größe von über 500 Bit. Es gibt spezielle Bibliotheken, die das können, aber ich glaube nicht, dass das der Sinn der Aufgabe ist.

Du kannst wie gesagt auch einen Fließkommatyp wie double benutzen. Hätte den zusätzlichen Vorteil, dass du bei negativem Argument die Möglichkeit hättest, im Rückgabewert ein ungültiges Ergebnis anzuzeigen. Allerdings wäre der Wert dann nicht genau. Fließkommatypen erkaufen sich die großen Wertebereiche durch verringerte Genauigkeit.

P.S.: Was ist ein "Schleifentyp"? Das habe ich noch nie gehört.

Also die 2te Aufgabe lautet so:

Programmieren Sie in der Programmiersprache C zwei weitere Funktionen zur Berechnung

von n!mit Hilfe von Schleifen. Wählen Sie sich dazu zwei Schleifentypen aus, die sie in

der Vorlesung kennengelernt haben. (Für-Schleife, Abweisenden-Schleife, Nicht-Abweisenden-

Schleife).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Eine kleine Ungenauigkeit steckt in deiner Funktion bei der Berechnung der Fakultät noch drin, mathematisch wird 0! auch als 1 definiert, dies wird in deiner Implementation jedoch nocht berücksichtigt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Eine kleine Ungenauigkeit steckt in deiner Funktion bei der Berechnung der Fakultät noch drin, mathematisch wird 0! auch als 1 definiert, dies wird in deiner Implementation jedoch nocht berücksichtigt.

Also ? hihi sorry kenne mich mit solchen sachen nicht gut aus.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ? hihi sorry kenne mich mit solchen sachen nicht gut aus.

Du solltest, bevor Du etwas programmierst Dir erst einmal anschauen was Du inhaltlich zu machen hast, siehe Fakultät (Mathematik)

Schau Dir den Abschnitt "Definition" an und schau Dir dazu Deinen Quellcode an. Du hast Deinen Algorithmus nicht vollständig umgesetzt. Du solltest Dich mit diesen "Sachen" in soweit auskennen, damit Du überhaupt einen Algorithmus in einer Sprache programmieren kannst

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...