Zum Inhalt springen

Euklidischer Algorithmus (C)


Empfohlene Beiträge

Geschrieben

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;

}

Geschrieben

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

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

Geschrieben

Wenn ich in mein Programm noch Schleifentypen reintue, würde es dann theoretisch den Wert 100 ausrechnen? Weil bei der zweiten Aufgabe soll ich Schleifentypen einbauen und die Werte nochmal testen.

Geschrieben
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

Geschrieben
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.
Geschrieben
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 :( )

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

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

Geschrieben
(Für-Schleife, Abweisenden-Schleife, Nicht-Abweisenden-

Schleife).

Ach so, ich dachte, Schleifentyp hätte etwas mit Datentyp zu tun :D

Welche Art von Schleife du in einer iterativen Lösung benutzt, ändert allerdings auch nichts daran, dass das Ergebnis nicht in einen int passt.

Geschrieben

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.

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

Geschrieben
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

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