1

我一直在研究一个程序,该程序在执行时要求输入两个数字,第一个是任何十进制数字,第二个数字是您希望转换为的基数 (2-16)。它工作得很好,除了一件事。每个输出都是向后的。这是意料之中的,它需要余数并按计算顺序输出它们。但是我希望他们以相反的顺序出现。我正在考虑设置一个循环并将余数存储在一个数组中,然后向后循环数组并吐出信息。但我是 C 的新手,我无法让它工作!告诉我你的想法!

任何帮助将不胜感激。我已经坚持了一段时间。

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

int main(void){

  int x, y, z, c; //Sets up variables to be used in program


  printf("Please enter two integers: "); //Asks for user input
  scanf("%d", &x);
  scanf("%d", &y); //stores input

  printf("%d\n", x);
  printf("%d\n", y);
  printf(" \n");

  if(y < 2 || y > 16){
    printf("You have entered incorrect information.\n");
           return 0;
  } //bug checks

  else if(y > 1 && y < 17){

    while(x != 0){
       c = (x%y);
       x = (x/y); // Loops numbers until a 0 value is reached, can be used with
                  // any Base

     if( c == 10){
        c = printf("A");
    }else if( c == 11){
        c = printf("B");
    }else if( c == 12){
        c = printf("C");
    }else if( c == 13){
        c = printf("D");
    }else if( c == 14){
        c = printf("E");
    }else if( c == 15){
        c = printf("F");
    }else{
        printf("%d", c);
    }
        // Returns for each remainer option
    }
    printf("\n");
  }
     // Returns for each remainer option
    printf("\n");
}
4

3 回答 3

1

宣布

int i = 0;
int rev[50];  

并将您的代码更改为

if( c == 10){
    rev[i++] = 'A' ;
}else if( c == 11){
    rev[i++] = 'B' ;
}else if( c == 12){
    rev[i++] = 'C' ;
}else if( c == 13){
    rev[i++] = 'D' ;
}else if( c == 14){
    rev[i++] = 'E' ;
}else if( c == 15){
    rev[i++] = 'F' ;
}else{
    rev[i++] = 48 + c;
}
    // Returns for each remainer option
}
printf("\n");
}
while(--i >= 0) 
    printf("%c", rev[i]); 
于 2013-10-03T19:50:37.227 回答
0

另一种方法是递归方法(对于非常长的序列,我不建议这样做,但由于整数的位数有限,您可以知道递归的深度)。它看起来像这样(未经测试,并且有点伪代码):

printnum(int n, int b)
{ int r;

  if (n < b)
    output n;
  else
  { r = n % b;
    printnum(n/b, b)
    output r;
  }
}

一个好的优化器甚至可以在编译时将其透明地转换为非递归代码。

于 2013-10-03T19:43:23.640 回答
0

将所有余数保存到字符数组中并反向打印数组

于 2013-10-03T19:33:14.127 回答