Zählen Einsätze
Kann mir jemand sagen, warum mein Programm immer falsch beantwortet? Es muss die Anzahl der Einsätze in einer Summe. Ich habe versucht, jeden testcase kam mir in den Sinn. Habe ich nicht bekommen, falsche Ausgabe.
Problem Beschreibung:
Kindern beigebracht wird, dass zum hinzufügen von multi-stellige zahlen, die von rechts nach Links eine Ziffer zu einem Zeitpunkt. Viele finden die "carry" - Betrieb, in dem Sie einen 1 erfolgt von einer Stelle Hinzugefügt werden, die nächsten zu sein, ist eine große Herausforderung. Ihre Aufgabe ist es, die Anzahl der Einsätze für jedes von einer Reihe von Zusatz Probleme damit, dass Lehrer bewerten können, Ihre Schwierigkeit hat.
Eingang
Jede Zeile der Eingabe enthält zwei ganze zahlen ohne Vorzeichen, die weniger als 10 Ziffern. Die Letzte Zeile der Eingabe enthält 0 0.
Ausgabe
Für jede Zeile außer der letzten, sollten Sie berechnen und drucken der Anzahl der Einsätze, die entstehen aus der addition der zwei zahlen im format unten dargestellt.
Beispiel Für Die Eingabe
123 456
555 555
123 594
0 0
Beispiel-Ausgabe
No carry operation.
3 carry operations.
1 carry operation.
Hier ist meine aktuelle code:
#include<stdio.h>
int main()
{
unsigned long long int a,b,m,n,rem_m,rem_n,judge=0,sum,count;
while((scanf("%llu%llu",&m,&n))==2)
{
if(m==0 && n==0)
{
break;
}
count=0;
while(m!=0 && n!=0)
{
rem_m=m%10;
rem_n=n%10;
if(judge==1)
{
rem_m++;
}
sum = rem_m+rem_n;
judge=0;
if(sum>=10)
{
count++;
judge++;
}
m=m/10;
n=n/10;
}
if(count==0)
{
printf("No carry operation.\n");
}
else
{
printf("%llu carry operations.\n",count);
}
}
return 0;
}
- Was ist also das problem? nicht immer eine Antwort für "0 0"?
- beim kompilieren, aktivieren Sie immer alle Warnhinweise (für gcc, mindestens:
-Wall -Wextra -pedantic
), dann beheben Sie die Warnungen. zum Beispiel: für den geposteten code, der compiler warnen, nicht verwendete variable 'a' und nicht verwendete variable 'b'. Empfehlen Platzierung jedes Variablen-Deklaration in einer separaten Zeile, zur besseren Lesbarkeit durch uns Menschen und für die einfache Dokumentation. - der code sollte eine entsprechende Aufforderung ausgegeben am Anfang. andernfalls ist er mit nichts mehr übrig, aber ein blinkender cursor und ohne Hinweis darauf, was Sie als Nächstes tun sollten.
- die variable
count
kann nie größer als 10 also, warum machen es zu einem "anzeiiri' variable? - die variable
judge
können niemals etwas anderes sein als 1 oder 0 sein, also warum sollte es ein "anzeiiri' variable? Auch der namejudge
ist sinnlos, in den aktuellen Kontext. Vorschlagen, etwas sinnvolles wie:carry
- dieser code-block: ` wenn(Richter==1) { rem_m++; } sum = rem_m+rem_n;` kann vereinfacht werden zu: ` Summe = rem_m+rem_n+PR;`
- Prüfung der code funktioniert einwandfrei, also, was ist die Frage?
- da die Kriterien, die zahlen sind weniger als 10 Ziffern. jeder Wert Eingabe muss überprüft werden, um sicherzustellen, es ist <= 99999999
Du musst angemeldet sein, um einen Kommentar abzugeben.
Geltendmachung a,b >= 0:
Knappe Lösung
For fun 🙂
"ds" steht für stellige Summe.
Lesbar
Hier ist eine besser lesbare Variante.
Können Sie den Beweis mathematisch: jedes mal, wenn Sie einen tragen, die digitSum sinkt von 9.
9, denn wir sind in der Nummer 10, damit wir "verlieren 10" auf eine Ziffer, wenn wir führen, gewinnen wir an +1 als das tragen.
Pythonic version
Ich weiß nicht, wie dies in C, aber in python ist es einfach, zu schreiben, eine bessere digitSum Funktion. In python wir können einfach erstellen Sie die Liste der Ziffern aus einer Zahl, und verwenden Sie dann die Funktion sum() auf, um Sie zu erhalten digitSum der gegebenen Zahl.
Hier ist eine knappe python-Einzeiler-Lösung:
Wird die Schleifenbedingung ist falsch. Sie möchten
while(m!=0 || n!=0)
(d.h. , während mindestens einer von Ihnen nicht null ist) stattwhile(m!=0 && n!=0)
, sonst wird die Antwort falsch sein, für Dinge wie999 9
wird, es nicht richtig beenden, nachdem eine iteration und Bericht 1-carry-Betrieb in der Erwägung, dass die richtige Antwort soll 3 sein. Denken Sie daran, wie diese: Sie möchten nur zu stoppen, wenn beide von Ihnen sind 0, so muss die Schleife so lange fortgesetzt, bis mindestens eine der zahlen ist 0.Sich auch, Sie vergessen zu reinigen
judge
nach dem Druck der Ausgabe. Sie müssen deaktivieren Sie es vor dem Lesen der Eingabe wieder, oder Sie könnten fälschlicherweisejudge == 1
aus einer früheren Berechnung, die endete mit tragen (die Wahl der Namen für diese variable scheint seltsam für mich, sollten Sie es umbenennen, um etwas sinnvolles wiecarry
, aber es ist nicht das Hauptthema hier).a
undb
sind unbenutzt (Sie sollte ermöglichen, dass der compiler Warnungen).Die Beispielausgabe zeigt das Wort Betrieb (in der Einzahl), wenn die Zählung ist 1; dein Programm schreibt immer Operationen (plural). Wenn Sie die übermittlung dieser an ein automatisches Richter, der code wird nicht passieren, weil die Ausgabe entspricht nicht genau dem erwarteten Ausgang. Zu beheben, dass kleine detail, ersetzen Sie diese:
Mit:
Hier ist die gefixte version:
Ruby-Lösung wäre:
Einer java-Lösung wäre: