Tengo que escribir un programa en C que tomará una base b del usuario (suponiendo que b está entre 2 y 10), un número natural n y luego n números que representan el dígitos de algún número m en la base b. El programa debería imprimir qué número decimal m fue ingresado. Por ejemplo, si coloca b=5 y n=4 y luego los números 3, 4, 2 y 1, el programa debería generar {{ X12}} porque m=3*5^3+4*5^2+2*5^1+1*5^0=486

Nota: Puede suponer que los dígitos serán los números entre 0 y b-1.

Entonces, esto es lo que he hecho:

#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;
}

¿Me puede decir por qué esto no funciona para los números dados en el ejemplo anterior? Produce 485 en lugar de 486, mientras que si tomo, por ejemplo, b=7, n=3 y luego los números 5, 6 y 1, obtengo la solución correcta {{X5} }.

-1
lmc 26 dic. 2016 a las 17:48

3 respuestas

La mejor respuesta

Sugiero verificar el valor de retorno de scanf(). Algo así es la idea correcta:

#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;
}

Entrada:

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

Salida:

Sum = 486
2
RoadRunner - MSFT 26 dic. 2016 a las 15:11

Necesita un pequeño cambio en su lógica.

#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;
}

Prueba

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

Prueba 2

 ./a.out
7
3
5
6
1
m=288                                                         
1
Niklas R. 26 dic. 2016 a las 15:12

Bien, dado un número binario, podemos generar un número decimal muy fácilmente. Simplemente printf ("% d% \ n", x);

El siguiente trabajo es convertir un número de dígitos dados y la base en un número binario (representación de máquina).

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

      return answer;
  }

Ahora conéctalo todo a main

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);
}
0
Malcolm McLean 26 dic. 2016 a las 15:03