7

我有一些家庭作业,但我把它堆起来了。也许你可以帮助我。下面的任务。

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

以新符号编写的控制台编号输出。

我只制作了 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;
}
4

5 回答 5

2

else条件需要一些更改:
1. 值到数字的转换需要应用于内部循环最终的printf("%d\n", number % base). 不要在两个地方都添加,只需让你的循环运行到j > 0,而不是j >= base只使用最后一个printf()for \n
2. 而不是使用幻数55使用result - 10 + 'A'. 它更容易理解并且不依赖于 ASCII - (依赖于 A、B、C ......是连续的)。
3.其余的都可以。

[编辑] @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");
  // }
于 2013-09-13T13:14:25.693 回答
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 的数字的未定义行为。

于 2013-09-13T13:09:57.923 回答
1

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

我建议制作一个函数来输出数字并在两个地方使用它:

void print_digit(int number) {
  // your code here
}
于 2013-09-13T13:25:04.780 回答
0

您可以添加字符和整数,因此请尝试更多类似的方法:

'A' + // some int value
于 2013-09-13T12:57:14.427 回答
0

另一方面,如果一个人喜欢一个不会​​下溢/溢出的解决方案,处理所有 INT_MIN 到 INT_MAX,没有 UB,只输入 INT_MIN <= number <= INT_MAX, 2 <= base <= 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;
}
于 2013-09-13T13:54:44.287 回答