2016-12-26 8 views
-1

Ich muss ein Programm in C schreiben, das eine Basis b vom Benutzer nimmt (vorausgesetzt, b ist zwischen 2 und 10), eine natürliche Zahl n und dann n Zahlen, die die Ziffern einer Nummer m in Basis b darstellen. Das Programm sollte ausdrucken, welche Dezimalzahl m eingegeben wurde. Zum Beispiel, wenn Sie setzen b=5 und n=4 und dann die Zahlen 3, 4, 2 und 1 das Programm ausgeben sollte 486 weil m=3*5^3+4*5^2+2*5^1+1*5^0=486Schreibe ein Programm in C, das eine Basis und n Ziffern nimmt und eine Dezimalzahl mit diesen Ziffern ausgibt

Hinweis: Sie können davon ausgehen, dass die Ziffern die Zahlen zwischen 0 sein und b-1.

Also hier ist was ich getan habe:

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

int main(void) { 
    int x,n,b,k=0,num=0,i,j; 
    scanf("%d", &b); 
    scanf("%d", &n); 
    for(i=1; i<=n; i++) { 
     scanf("%d", &x); 
     for(j=1; j<b; j++){ 
      if(j>k){ 
       num=num+x*(pow(b,n-j)); 
       k=j; 
       break; 
       } 
     } 
    } 

    printf("m=%d", num); 

return 0; 
} 

Können Sie mir sagen, warum dies nicht für die Zahlen in dem oben angegebenen Beispiel funktioniert? Es gibt 485 statt 486 aus, während wenn ich zum Beispiel b=7, n=3 und dann Nummern 5, 6 und 1 nehme, bekomme ich die richtige Lösung m=288.

+5

ist SO kein Debugging-Service. Kompilieren Sie mit Symbolen, führen Sie den Code in einem Debugger aus, um das/die Programm (e) Zeile für Zeile zu verfolgen und die Werte der relevanten Variablen zu untersuchen, um zu erfahren, was wirklich vor sich geht. Wenn dann eine * spezifische * Frage aufkommt, fühlen Sie sich frei, hierher zurückzukommen. – alk

+0

Es ist ein * Fehler *, den Rückgabewert von 'scanf' nicht zu überprüfen. –

+4

Verwenden Sie 'pow' nicht für einfache Ganzzahlarithmetik wie diese. –

Antwort

2

Ich schlage vor, den Rückgabewert von scanf() Überprüfung So etwas ist die richtige Idee:

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

int 
main(int argc, char *argv[]) { 
    int base, n, i, x, sum = 0, power; 

    printf("Enter base: "); 
    if (scanf("%d", &base) != 1) { 
     printf("Invalid base.\n"); 
     exit(EXIT_FAILURE); 
    } 

    printf("Enter n: "); 
    if (scanf("%d", &n) != 1) { 
     printf("Invalid n.\n"); 
     exit(EXIT_FAILURE); 
    } 

    power = n-1; 

    printf("Enter numbers: "); 
    for (i = 0; i < n; i++) { 
     if (scanf("%d", &x) != 1) { 
      printf("Invalid value.\n"); 
      exit(EXIT_FAILURE); 
     } 
     sum += x * pow(base, power); 
     power--; 
    } 

    printf("Sum = %d\n", sum); 

    return 0; 
} 

Eingang:

Enter base: 5 
Enter n: 4 
Enter numbers: 3 4 2 1 

Ausgabe:

Sum = 486 
0

OK, also bei einer Binärzahl können wir sehr einfach eine Dezimalzahl ausgeben. Nur printf ("% d% \ n", x);

Der nächste Job besteht darin, eine Zahl mit gegebenen Ziffern und Basis in eine binäre (Maschinendarstellung) Nummer umzuwandeln.

int basetointeger(const char *digits, int b) 
    { 
     assert(b >= 2 && b <= 10); 
     // code here 

     return answer; 
    } 

es nun zur Haupt

int main(void) 
{ 
    int x; 
    int base; 
    char digits[64]; // give more digits than we need, we're not worrying about oveflow yet 
    /* enter base *? 
    code here 
    /* enter digits */ 
    code here 
    x = basetointger(digits, base); 
    printf("Number in decimal is %d\n, x); 
} 
alle hook up
1

Sie brauchen eine kleine Änderung an Ihrer Logik.

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

int main(void) { 
    int x, n, b, num = 0, i; 
    scanf("%d", &b); 
    scanf("%d", &n); 
    for (i = 1; i <= n; i++) { 
     scanf("%d", &x); 
     num += x * pow(b, n - i); 
    } 
    printf("m=%d", num); 
    return 0; 
} 

-Test

gcc -Wall main.c -lm 
$ ./a.out 
5 
4 
3 
4 
2 
1 
m=486 

-Test 2

./a.out 
7 
3 
5 
6 
1 
m=288               
Verwandte Themen