我已经编写了这个代码,用于将十进制数转换为二进制数,但是它打印数字反之亦然,我该如何才能使这个工作? 我可以使用getch命令来实现它我们正在学习getch。
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
for(;n>0;n=n/2){
int d = n%2;
printf("%d", d);
}
return 0;
}
答案 0 :(得分:4)
使用递归函数可能会变得棘手:
#include <stdio.h>
void print_binary(int n)
{
if (n != 0) {
print_binary(n/2);
printf("%d ", n%2);
}
}
int main() {
int n;
scanf("%d", &n);
print_binary(n);
return 0;
}
在递归调用返回后打印,数字按相反顺序打印。
每次调用print_binary
时,它都会使用n/2
参数调用自身,然后打印最低有效位。但是,每次递归调用都会做同样的事情。
以下是n
等于11(二进制1011)的调用堆栈:
main
scanf
print_binary(11)
print_binary(5)
print_binary(2)
print_binary(1)
print_binary(0)
printf("%d ", 1);
printf("%d ", 0);
printf("%d ", 1);
printf("%d ", 1);
您可以看到,这会导致首先打印最重要的位。
答案 1 :(得分:3)
这是另一种方式,从最重要的位工作,具有“零抑制”。不需要逆转。
#include <stdio.h>
int main(void) {
int n = 0; // the value
int hadone = 0; // 0 suppression control
int bits = 8 * sizeof n; // assume 8 bits for example
unsigned mask = 1u << (bits-1); // set msb of mask
scanf("%d", &n);
while(mask) {
if(n & mask) { // is it a 1 bit?
putchar('1');
hadone = 1; // cancel 0 suppression
}
else if(hadone || mask == 1) { // ensure a lone `0` goes out
putchar('0');
}
mask >>= 1; // next bit
}
putchar('\n');
return 0;
}
计划会议:
42
101010
答案 2 :(得分:0)
这是一个非递归的解决方案:
#include <stdio.h>
int main() {
int n;
char buf[100];
char *bp;
printf("Enter number: ");
fflush(stdout);
scanf("%d", &n);
bp = buf;
// store into array instead of printing [chars will be reversed]
// NOTE: we use "bp == buf" to force output if entered number is zero
for (; n>0 || bp == buf; n=n/2){
int d = n%2;
bp += sprintf(bp, "%d", d);
}
// print array in reverse order
for (bp -= 1; bp >= buf; --bp)
fputc(*bp,stdout);
printf("\n");
return 0;
}
答案 3 :(得分:0)
您可以将数字存储到数组中,然后将其反转,以获得正确的数字。