# Fakultät; Zahlen nach Text & ggT und kgV



## unistar (5. Dezember 2005)

Hallo zusammen,

ich habe ein paar Fragen zu einigen Aufgaben die ich mich beschäftigen muss. Leider freunde ich mich sehr schwer mit C++ an aber muss studientechnisch ein paar Basics haben. 

Die erste Aufgabe habe ich noch (mit Hilfe) hinbekommen. Die lautete 

1. Schreiben sie ein Programm, das mit einer _for_ Schleife für die Zahlen 0 ... 50 die Fakultät berechnet und zeilenweise in der Form:

n : n!

ausgibt.


*Ich hab das so gelöst:*

#include <stdlib.h>
#include <stdio.h>

int main ( int argc, char *argv[])
{

double n;

for( int i=0; i<=50; i++ )
{
    n=1;
    for ( int j=1; j<=i; j++ ) n = n * j;
    printf (" %d : %lf \n", i, n);

}

return 0;
}

Ich versteh das alles nicht so richtig was die einzelen Befehle heissen, aber beim Ausführen klappt das 


Danach sollte ich ein Programm schreiben, welches die identische Funktionalität hat wie das erste aber diesmal mit einer _while_ Schleife. Das hab ich auch versucht aber das funktioniert nicht.

#include <stdlib.h>
#include <stdio.h>

int main ( int argc, char *argv[]) {

    double n=1;

    int i = 0;
    while ( i<=50 ) {

        int j = 1;
        while ( j<=i ) {
            n = n * j;
            j++;
        }
        printf (" %d : %lf \n", i, n);
        i++;
    }

    return 0;
}


Kann mir einer sagen, wo der Fehler hier im Programm ist ?

Bei den letzten beiden Aufgaben (3 und 4) hab ich gar keine Peilung.

Bei 3 muss ich auch ein Programm schreiben, das eine *integer * Zahl einliest und diese mit einer Scheife und einer *switch* Anweisung im Wortlaut ausgibt. Bespiel für die Zahl 347:

Drei Vier Sieben

Und bei der Aufgabe 4 (ggT und kg) muss das Programm zwei integer Zahlen einlesen und dazu den größten gemeinsamen Teiler (ggT) und das kleinste gemeinsame Vielfache (kgV) berechnet. Die Aussage soll wie folgt sein (Bespiel für 6 und 26):

ggT (6,26) = 2
kgV (6,26 = 78



Ich hoffe ihr könnt mir irgendwie weiterhelfen weil ich das einfach nicht kann bwz. verstehe.

DANKESCHÖN

gruß

unistar


----------



## deepthroat (5. Dezember 2005)

Hi.


			
				unistar hat gesagt.:
			
		

> ```
> #include <stdlib.h>
> #include <stdio.h>
> 
> ...


Warum hast du denn jetzt die Deklaration und Initialisierung der Variable "n" außerhalb der Schleife?


			
				unistar hat gesagt.:
			
		

> Bei den letzten beiden Aufgaben (3 und 4) hab ich gar keine Peilung.
> 
> Bei 3 muss ich auch ein Programm schreiben, das eine *integer * Zahl einliest und diese mit einer Scheife und einer *switch* Anweisung im Wortlaut ausgibt. Bespiel für die Zahl 347:
> 
> Drei Vier Sieben


Tip: Einlesen geht mit scanf - genauer bei einem int so:
	
	
	



```
int i;
scanf ("%d", &i);
```

Wie eine switch Anweisung auszusehen hat, kannste ja z.B. mit Google rausfinden.

Dann würde ich die Zahl erstmal umdrehen (Modulo 10 gibt dir die kleinste Stelle, Integer-Division durch 10 schneidet die kleinste Stelle der Zahl ab) und in eine andere Variable speichern.

Danach einfach nur noch jeweils Stelle für Stelle ausgeben.


			
				unistar hat gesagt.:
			
		

> Und bei der Aufgabe 4 (ggT und kg) muss das Programm zwei integer Zahlen einlesen und dazu den größten gemeinsamen Teiler (ggT) und das kleinste gemeinsame Vielfache (kgV) berechnet. Die Aussage soll wie folgt sein (Bespiel für 6 und 26):
> 
> ggT (6,26) = 2
> kgV (6,26 = 78


Wie man ggT und kgV berechnet sollte dir evtl. noch aus der Schule bekannt sein. Wenn nicht lassen sich sicherlich hier oder mit Google ein paar Lösungen finden.

Gruß


----------



## jokey2 (5. Dezember 2005)

Nur ein leiner Fehler, aber große Wirkung :
Du mußt in jedem Durchlauf der äußeren Schleife n=1 setzen. Sonst fängst du ja schon mit dem Ergebnis des letzten Durchlaufes als Startwert an. Also auf Deine Weise mußt Du noch eine Zeile
	
	
	



```
n = 1;
```
nach der Initialisierung von j einfügen, dann geht es.
Du könntest natürlich auch diesen Effekt zur Optimierung verwenden, da z.B. gilt: 3! = 2! + 3. Du kannst also das Ergebnis des vorherigen Durchlaufes nutzen und mußt nicht immer wieder die innere schleife ausführen.
Den Code dafür schreibe ich hier nicht hin, versuche erstmal, das alleine hinzukriegen.


----------



## Matthias Reitinger (5. Dezember 2005)

jokey2 hat gesagt.:
			
		

> Du könntest natürlich auch diesen Effekt zur Optimierung verwenden, da z.B. gilt: 3! = 2! + 3.


Fast… n! = (n-1)! * n


----------



## jokey2 (5. Dezember 2005)

Alternativvorschlag für das Ausgeben der Zahlen in Worten: Du liest die Zahl als Integer ein und wandelst sie dann mit sprintf(...) in einen String um. Den gehst Du dann Zeichen für Zeichen durch und gibst die entsprechenden Worte aus:
	
	
	



```
switch(zeichen)
{
    case '1': printf("eins "); break;
    case '2': printf("zwei "); break;
    case '3': printf("drei "); break;
    .
    .
    .
}
```


----------



## jokey2 (5. Dezember 2005)

> Fast… n! = (n-1)! * n


Ups! Dat war'n Tippfehler! So stimmt es natürlich.


----------



## unistar (6. Dezember 2005)

Hi und vielen Dank für die vielen Antworten. Ich hab das mit der while Schleife nu auch hinbekommen aber bei der Aufgabe 3 und 4 komm ich nicht weiter - ich hab Programmierung erst seit kurzem und deshalb bin ich da noch nicht so gewandt. Wenn sonst jemand noch tipps parat hat, dann wäre ich sehr dankbar. 

DANKE

unistar


----------



## jokey2 (6. Dezember 2005)

Also, füe die Aufgabe 3 hast Du hier schon 2 Vorschläge, bei denen eigentlich nicht mehr viel fehlt, außer etwas Nachdenken.
Zu ggT und kgV gibt's ne ganze Menge im Internet.


----------



## DerSensenmann (7. Dezember 2005)

also als tipp 
kauf dir nen buch.

außerdem würde ich anstatt printf() lieber cout und zum einlesen cin verwenden.
dafür musste iostream.h einbinen ( oder auch nur ciostream)
macht das programm ein bischen leichter verständlich ( bzw c++ )

um zu überprüfen was and em prog net geht , kannst acuh auch in deine schleife ne ausgabe bauen: 
also etwa so 
....
while(1)
{
     n= j+j;
     cout << n;
}
....

aber ein bcuh ist immer gut oder lad dir ein tutorial aus dem inet.


----------

