2017-02-01 3 views
0

Ich habe gerade C-Programmierung mit CS50 gestartet.CS50 Greedy-Algorithmus

Ich habe versucht, das Problem über den Greedy-Algorithmus zu tun, aber kann nicht scheinen, den Fehler zu finden. Mein Code ist unten.

#include <cs50.h> 
#include <stdio.h> 
#include <math.h> 


int main (void) 
{ 

int count = 0; 

printf("how much is the change?: "); 

float change = get_float(); 

while(change < 0) 
{ 
    printf("change is to be more than 0"); 
    change = get_float(); 
} 

int amount = lroundf(change*100); 

while(amount > 0) 
{ 
    if ((amount-25) >= 25) 
    { 
     amount = amount - 25; 
     count++; 
    } 

    else if ((amount-10) >= 10) 
    { 
     amount = amount - 10; 
     count++; 
    } 

    else if ((amount-5) >= 5) 
    { 
     amount = amount -5; 
     count++; 
    } 

    else if((amount-1) >= 1) 
    { 
     amount = amount -1; 
     count ++; 
     break; 
    } 

    else 
    { 
    printf("you have no change \n"); 
    } 
    } 
    printf("your number of coins is %i\n", count); 

    } 

Wenn ich meine Änderung als 1 eingib, bekomme ich 8 Münzen zurück. Kann nicht finden, wo der Fehler ist. Kann mir jemand helfen?

+2

Haben Sie [cs50.se] überprüft? –

+2

'> = 25' ->'> = 0' und so weiter. oder einfach '(Betrag-25)> = 25' ->' Betrag> = 25' – BLUEPIXY

Antwort

0

Zuerst können Sie versuchen, Ihr Programm mit Werten für 10 zu starten, die einfache Antworten wie 1 Münze zurückgeben, z. B. change = 0.25. Wenn das funktioniert, sollten Sie mit ein paar Münzen versuchen, einen Typ wiederholen, wie Sie es mit 1.00 getan haben, oder mit ein paar Typen wie 0.06. Versuchen Sie danach große Zahlen und Werte mit einer höheren Schwebe-Ungenauigkeit wie 4.10. Dies sollte Sie zu Ihren Antworten führen.

Wenn, nachdem Sie das versucht haben, Sie immer noch das Problem nicht finden, dann hier ist die Antwort: Das Problem ist mit den if/else if Ausdrücken. Wenn Sie beispielsweise versuchen, die Viertel zu zählen, funktioniert die (amount-25) >= 25 nicht ordnungsgemäß. Sie versuchen, ein Viertel wegzunehmen, während amount größer oder gleich 25 ist, aber Ihr Code nur tun, bis es zu weniger als 50 kommt. Entwickeln Sie Ihren Ausdruck kann Ihnen helfen, es zu sehen: (amount-25) >= 25 ->(amount-25) + 25 >= 25 + 25 ->amount >= 50.

Ein anderes Problem, das Sie finden können, ist mit dieser break Aussage. Es könnte früher als erwartet aus der Schleife herauskommen. Wenn Sie versuchen, Zahlen wie 0.04 und 0.03 zu verwenden, sehen Sie die Zählung fest bei 1. Nach dem Entfernen der ersten Penny bricht der Code aus der Schleife amount immer noch größer als 0 verlassen. break s machen es schwieriger zu sehen, wenn der Code aus der Schleife kommt, und deshalb empfehlen viele Programmierer zu vermeiden, wann immer es möglich ist.

+1

Vielen Dank für Ihre detaillierten Antworten, hat mir sehr geholfen. –

Verwandte Themen