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