2016-09-13 2 views
-6

Ich wurde gebeten, eine leere Funktion in c (keine Schleifen) zu schreiben, die eine gerade Zahl erhält (etwa 80), und druckt es so 2 * 2 * 5 * 2 * 2 Wie Sie sehen können, ist das Ergebnis 80 lol. Zwischen 2 Zahlen müssen Sie "*" und die ungerade Zahl (für mein Beispiel 5) müssen Sie in der Mitte drucken, oder wenn es eine ungerade Anzahl von "2" in der Zahl gibt, sagen wir 96 Sie müssen es so drucken: 2 * 2 * 2 * 3 * 2 * 2 Wenn die angegebene Zahl ungerade ist, geben Sie die Zahl zurück. Ich möchte nicht nur die Antwort bekommen, sondern die Art, wie Sie "denken", bevor Sie mit dem Code beginnen. Hier ist das, was ich habe bisherFaktorisierung in C-Rekursion

if(n%4==0) 
{ 
    printf("2*"); 
    PrintTwos(n/4); 
    return; 
} 
if(n%2==0) 
{ 
printf("*2"); 
PrintTwos(n/2); 
    return; 
    } 
    printf("%d",n); 
+2

Wie würden Sie das tun (mit Stift und Papier)? Was versuchst du bisher zu programmieren? – purplepsycho

+1

Code anzeigen! – vz0

+0

vor allem über eine Stoppbedingung nachdenken. Sagen wir, wenn die Zahl ungerade ist. Aber mein Hauptproblem ist zu verstehen, wie ich meine Nummer so drucken kann, dass mein seltsamer Faktor (5, tut mir leid, wenn das nicht das richtige Wort dafür ist) in der Mitte erscheint und nicht in der Ende – user6788452

Antwort

2

hier einige Pseudo-Code:

func(nbr) 
    isOdd(nbr)   // recursive stop condition 
    print nbr 
    return 

    evenNbr = findFirstEven(nbr) //return the shortest even number from nbr 
    print evenNbr 
    func(nbr/evenNbr) 

ich nicht Logik für die * Druck hinzugefügt haben, weil ich sicher bin, u herausfinden kann, dass etwa selbst . Und ein Fall wird diesen Pseudocode brechen, aber das ist ein guter Anfang, um Ihnen zu helfen, darüber nachzudenken, was Ihre rekursive Funktion tun sollte.

EDIT folgende Anmerkungen: (nicht vollständig: ungerade Zahl in der Mitte in diesem fehlt)

int findFirstEven(nbr, i) { 
    if (nbr%i != 0) 
     return findFirstEven(nbr, i++); 
    return i; 
} 

int primefact(int n) 
{ 
    int i=2; 
    i = findFirstEven(n, i); 

    printf("%d*", i); 
    if(n==i) 
     printf("1"); 
     return 0; 
    else 
     primefact(n/i); 
} 

(nicht getestet)

+0

Kann ich bitte die Lösung für dieses Problem hinzufügen und mir helfen zu verstehen, was dort vor sich geht? – user6788452

+0

Willst du nicht ein wenig suchen? ist es eine schulübung? Wenn ja, ist das Ziel, selbst zu denken. Du hast fast alles hier. Aber wenn Sie wirklich nicht wollen ... ok ... –

+0

müssen Sie etwas tun, um die Primzahl zu finden. Du kannst nicht 'wenn' für alle Primzahlen in Ordnung halten :) Lass uns den Hauptbeitrag zusammen bearbeiten –

1

Sie benötigen 2 die in Hälften zu verteilen, so dass Sie entfernen müssen zwei zwei von der Zahl vor dem rekursiven Schritt - sonst müsste der rekursive Schritt wissen, wie tief es ist, zu viele Zweier auf der linken Seite zu drucken.
Natürlich müssen Sie überprüfen, ob es tatsächlich zwei Zweien gibt!

So:

void PrintTwosInNumber(unsigned n) 
{ 
    if(n % 4 == 0) 
    { 
     printf("2*"); 
     PrintTwosInNumber(n/4); 
     printf("*2"); 
    } 
    else if(n % 2 == 0) 
    { 
     printf("2*"); 
     PrintTwosInNumber(n/2); 
    } 
    else 
     printf("%u", n); 
} 

Sie können den letzten rekursiven Schritt sparen mit

void PrintTwosInNumber(unsigned n) 
{ 
    if(n % 4 == 0) 
    { 
     printf("2*"); 
     PrintTwosInNumber(n/4); 
     printf("*2"); 
    } 
    else if(n % 2 == 0) 
     printf("2*%u", n/2); 
    else 
     printf("%u", n); 
} 

Edit:

Bitte beachten Sie die Funktion in eine unendliche Rekursion für n==0 fallen - Null ist unendlich teilbar durch 2. Jedoch kann nicht als ein Produkt aus einer beliebigen Anzahl von 2 und einigen ungeraden Zahlen dargestellt werden, so dass es außerhalb des Geltungsbereichs dieses Problems liegt.
Jedenfalls wenn es eine echte Programmieraufgabe war, sollte man diesen speziellen Fall berücksichtigen und einen schützenden if(n==0) return; Zweig hinzufügen, nur um auf der sicheren Seite zu sein, wenn ein Anrufer einen falschen Parameterwert übergibt.

+0

Sehr elegante Lösung! – Xaver

Verwandte Themen