C 十六进制的问题

C 十六进制的问题,c,C,我有一些家庭作业,但我累坏了。也许你能帮我。任务如下 读取键盘中的整数十进制并建立新的数字系统 以新符号写入控制台编号中的输出 我只做了2到10个系统,但我不能做10到36个。我试着在第二个循环中做这样的事情: if ( result > 9 ) { printf("%c", 55+number); } else { printf("%d", result); } 我的代码: #include <stdio.h> in

我有一些家庭作业,但我累坏了。也许你能帮我。任务如下

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

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

我只做了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;
}
#包括
int main(){
整数,基数;
int i,结果;
scanf(“%d%d”、&number和base);
如果(数量<基数){
printf(“%d\n”,数字);
}否则{
对于(i=base;i=base;j/=base){
结果=数量/j;
printf(“%d”,结果);
编号=编号%j;
}
printf(“%d\n”,数字%base);
}
返回0;
}

您可以添加字符和整数,因此请尝试以下方法:

'A' + // some int value
整数,基数;
scanf(“%d%d”、&number和base);
整数除数=基数;

while(除数)else
条件需要一些更改:
1.值到数字的转换需要应用于内部循环和最终的
printf(“%d\n”,数字%base)
。不必在这两个位置都添加,只需使循环运行到
j>0
,而不是
j>=base
,并且只对
\n
使用最后一个
printf()
2.不要使用幻数
55
而使用
结果-10+'a'
。它更容易理解,并且不依赖于ASCII-(依赖于a、B、C…连续)。
3.剩下的没问题

[编辑] @nos指出了
if()
条件的问题。
因此,删除if(number
,并将(i=base;
更改为(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");
  // }
/}其他{
对于(i=1;i=base;j/=base){
对于(j=i;j>0;j/=base){
结果=数量/j;
#如果1
如果(结果>9){
//printf(“%c”,55+结果);
printf(“%c”,结果-10+A”);
}否则{
printf(“%d”,结果);
}
#否则
printf(“%d”,结果);
#恩迪夫
编号=编号%j;
}
printf(“\n”);
// }

您的思路正确,非常接近答案。您的程序正在两处打印结果数字

我建议使用单个函数来输出数字,并在两个位置使用它:

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

另一方面,如果一个解决方案不在/overflow下,处理所有INT_MIN到INT_MAX,不使用UB,只输入INT_MIN,我在第一个for循环后看到一个分号。这可能是一个错误。@NikolaiRuhe我想他是在确定一个值并将其放入
I
(变量名称不正确)使用它来初始化
j
。分号是需要的,但可能会被误认为是错误的。我建议将分号放在单独的一行,并+*+添加注释,告诉读者你在做什么+*+@SvenS当然你是对的。谢谢你的澄清。@Eric Posolsky欢迎这样做。尽管发布了解决方案,但是sider正在回滚代码的删除,因为没有该代码,各种答案都不清楚。可能会添加一个“”最后请注意解释您的选择/想法。@Eric Posolsky您的电话-我没意见。我发现在参考较旧帖子的答案时,看到原始问题和最终答案很有用。我看不出有任何区别,65-这是一个ascii表格,运行良好,我想问题更严重。如果是h,结果不是我所期望的ex system.如果我输入13-数字和16-基数,我会从你的程序中得到N,因此出现了一些问题。另外,我只需要使用for循环。谢谢你的回复。@EricPosolsky更正,我忘记了字母的偏移量10。编辑错误。@EricPosolsky现在它与你所做的非常接近(我认为可读性更强一些)。看起来不错,谢谢,但我们不能使用while,只能用于循环。但我现在看到了不同。非常感谢!我为此任务牺牲了将近一天的时间。请注意,在此之前的if条件,
if(number
应该被删除。只有base为
void print_digit(int number) {
  // your code here
}
#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;
}