2017-01-31 6 views
0

Ich komme nach SO als letzter Ausweg. Ich habe versucht, diesen Code für die letzten 2 Stunden zu debuggen. Wenn die Frage für eine andere SE-Website geeignet ist, sagen Sie es mir bitte vor dem Abstimmen.Reverse zwei Zahlen und erhalten die Umkehrung der Summe

Hier geht es:

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

int reverse(int n) { 
    int count = 0, r, i; 
    int k = (int)log(n * 1.0); 
    for(i = k; i >= 0; i--) 
    { 
     r = (n % 10); 
     n = (n/10); 
     count = count + (r * pow(10, k)); 
    } 
    return count; 
} 

int main(void) { 
    int t; 
    scanf("%d", &t); 

    while(t--) 
    { 
     int m, n, res; 
     scanf("%d %d", &m, &n); 
     res = reverse(m) + reverse(n); 
     printf("%d", reverse(res)); 
    } 
    return 0; 
} 

Mein Ziel ist es zwei Zahlen als Eingabe zu erhalten, so dass sie umkehren, fügen Sie die umgekehrten Zahlen und dann umgekehrt das Ergebnis als well.I, dies zu tun für ‚t‘ Test Fälle.

Das Problem: http://www.spoj.com/problems/ADDREV/

Haben Sie Fragen, wenn der Code nicht klar ist, fragen Sie mich bitte in den Kommentaren. Danke.

EDIT: Das Programm wird erfolgreich kompiliert. Ich bekomme immer eine vage Ausgabe. Angenommen, die zwei Nummern als Eingang 24 und 1 ist, erhalte ich eine Leistung von 699998. Wenn ich 21 versuchen und 1, I 399998.

+0

Was ist das Problem mit dem Code, den Sie haben? Für einige Beispieleingabe, was ist die erwartete und tatsächliche Ausgabe? Erhalten Sie Buildfehler? Laufzeitfehler oder Abstürze? Etwas anderes? Und bitte nehmen Sie sich etwas Zeit (lesen Sie, wie Sie gute Fragen stellen können) (http://stackoverflow.com/help/how-to-ask). –

+0

Sie können nicht angeben, was Ihr tatsächliches Problem ist. Zum Beispiel, hängt es damit zusammen, wie die Zahlen gelesen werden? Wenn Sie Ihren scanf betrachten, berücksichtigen Sie nicht Whitespace/newlines in der ersten Lese- und in jeder anderen Lese danach. –

+0

@DavidHoelzer Die Verwendung des '"% d "' Formats beim Lesen der Eingabe mit 'scanf' (und Freunden) verwirft den führenden Leerraum. –

Antwort

3

Gut erhalten, wenn Sie richtig hatten Ihren Code debuggen Sie bemerkt haben würden seltsame Werte von k. Dies liegt daran, Sie log verwenden, die

Ermittelt die natürliche (Basis e) Logarithmus von arg.

(nahm aus verknüpften Referenz, Hervorhebung von mir).

So wie Sie versuchen, die ‚Länge‘ der Zahl erhalten Sie log10 oder eine convertion (siehe wiki about change of base for logarithms) wie diese verwendet werden soll: log(x)/log(10) die gleich log10(x)

Und jetzt lassen Sie uns hier: pow(10, k) < - Sie berechnen immer 10^k, aber Sie brauchen 10^i, also sollte es stattdessen pow(10, i) sein.

Bearbeiten 1: Dank @DavidBowling für das Aufzeigen eines Fehlers mit negativen Zahlen.

Ich weiß nicht, wie genau Sie mit negativen Zahlen zu tun haben, aber hier ist eine der möglichen Lösungen:

  1. vor k Berechnung:

    bool isNegative = n < 0; n = abs(n);

  2. Jetzt ist Ihre n ist positiv, da abs() absoluten Wert zurückgibt. Fahren Sie auf dem gleichen Weg fort.

  3. Nach for Schleife mal sehen, ob n negativ war und count entsprechend ändern:

    if (isNegative) { count = -count; } return count;

Hinweis: dieser Lösung haben wir die Zahl selbst und lassen Sie die Zeichen umgekehrt, wie es ist .

+0

vielen Dank. Ich hatte gerade den zweiten Fehler herausgefunden. Ich wünschte, ich könnte Ihre Antwort zweimal upvote. –

+0

@KaranSingh du bist willkommen :) –

+1

Der OP-Code wird Probleme für nicht positive Ganzzahlen führen. –

0

Unter der Haube erhalten Sie Zeichenkette, um es auf numerische umkehren, als umgekehrt es zu char. Da ist bequemere Arbeit mit Zeichen als Zeichen lassen sie:

char * reverse (char *s,size_t len) //carefull it does it in place 
{ 
    if (!len) return s; 
    char swp, *end=s+len-1; 
    while(s<end) 
    { 
     swp =*s; 
     *s++=*end; 
     *end--=swp; 
    } 
    return s; 
} 
void get_num(char *curs) 
{ 
    char c; 
    while((c=getchar())!='\n') 
     *curs++=c; 
    *curs=0; 
} 
int main() 
{ 
    double a,b,res; 
    char sa[20],sb[20],sres[20],*curs; 
    get_num(sa); 
    get_num(sb); 
    reverse(sa,strlen(sa)); 
    reverse(sb,strlen(sb)); 
    sscanf(sa,"%f",&a); 
    sscanf(sb,"%f",&b); 
    res=a+b; 
    sprintf(sres,"%f",res); 
    reverse(sres); 
    printf(sres); 

} 
1

Es ist wie Yuri sieht schon Ihr Problem gefunden, aber ich könnte eine kürzere Version des Programms vorschlagen? Es vermeidet die Verwendung von Sachen wie Log, die wünschenswert sein könnten.

#include <stdio.h> 

int rev (int n) { 
    int r = 0; 
    do { 
     r *= 10; 
     r += n % 10; 
    } while (n /= 10); 
    return r; 
} 

int main (void) { 
    int i,a,b; 
    scanf("%d",&i); 

    while (i--) { 
     scanf("%d %d",&a,&b); 
     printf("%d\n",rev(rev(a) + rev(b))); 
    }  
    return 0; 
} 

Hoffentlich finden Sie etwas Nützliches zum Ausleihen! Es scheint auch für negative Zahlen zu funktionieren.

Verwandte Themen