十六进制的问题

时间:2013-09-13 12:52:00

标签: c

我得到一些作业,但我堆叠在里面。也许你可以帮助我。下面的任务。

  

读取十进制系统中的键盘整数并建立新的数字系统。

     

以新表示法编写的控制台编号输出。

我只为2到10个系统制作,我不能从10到36制作。我试图在第二个循环制作这样的东西:

if ( result > 9 ) {
    printf("%c", 55+number);
} else {
    printf("%d", result);
}

我的代码:

#include <stdio.h>

int main() {
    int number, base;
    int i, result;

    scanf("%d %d", &number, &base);

    if ( number < base ) {
        printf("%d\n", number);
    } else {
        for ( i = base; i <= number / base; i *= base );
        for ( int j = i; j >= base; j /= base ) {
            result = number / j;
            printf("%d", result);
            number = number % j;
        }
        printf("%d\n", number%base);
    }
    return 0;
}

5 个答案:

答案 0 :(得分:2)

else条件需要进行一些更改:
1.数值转换需要应用于内循环到最终printf("%d\n", number % base)。不要在两个地方添加,只需将循环设置为j > 0,而不是j >= base,而只使用printf()的最后\n。 2.而不是使用幻数55使用result - 10 + 'A'。它更容易理解,也不依赖于ASCII - (取决于A,B,C ......是连续的) 其余的都没问题。

[编辑] @nos指出了if()条件的问题 因此,请删除if ( number < base ) { ... else {并将for (i = base;更改为for (i = 1;,从而制定更简单的解决方案。

  // } else {
    for (i = 1; i <= number / base; i *= base)
      ;
    int j;
    // for (j = i; j >= base; j /= base) {
    for (j = i; j > 0; j /= base) {
      result = number / j;
#if 1
      if (result > 9) {
        // printf("%c", 55 + result);
        printf("%c", result - 10 + 'A');
      } else {
        printf("%d", result);
      }
#else
      printf("%d", result);
#endif      
      number = number % j;
    }
    printf("\n");
  // }

答案 1 :(得分:1)

int number, base;
scanf("%d %d", &number, &base);

int divisor = base;
while (divisor <= number)
    divisor *= base;

while (divisor != 1) {
    divisor /= base;
    int digit = number / divisor;
    number -= digit * divisor;
    printf("%c", digit <= 9 ? digit + '0' : digit + 'A' - 10);
}
printf("\n");
return 0;

警告:大于~200000000的数字的未定义行为。

答案 2 :(得分:1)

你走在正确的轨道上并且非常接近答案。您的程序正在两个位置打印结果数字。

我建议使用单个函数输出数字并在两个地方使用它:

void print_digit(int number) {
  // your code here
}

答案 3 :(得分:0)

您可以添加字符和整数,请尝试更类似的内容:

'A' + // some int value

答案 4 :(得分:0)

另一方面,如果一个人喜欢不在/溢出的解决方案,则将所有INT_MIN处理为INT_MAX,不处理UB,只输入INT_MIN&lt; = number&lt; = INT_MAX,2&lt; = base&lt; = 36 ,你不介意递归。

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

void print_digit(int x, int base) {
  int quot, rem;
  quot = x/base;
  if (quot) {
    print_digit(quot, base);
  }
  rem = abs(x%base);
  if (rem > 9) {
    printf("%c", rem - 10 + 'A');
  } else {
    printf("%d", rem);
  }
}

int main() {
  int number, base;
  scanf("%d %d", &number, &base);
  if (number < 0) {
    printf("-");
  }
  print_digit(number, base);
  printf("\n");
  return 0;
}
相关问题