2016-11-04 72 views
2

我已经编写了用于将十进制数字转换为二进制数据的代码,但是它反之亦然,我怎样才能完成这项工作? 我可以使用getch命令使它发生,我们正在学习getch。如何从右到左制作printf

#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; 
} 
+3

你可以每个值写入到一个数组,然后打印从它的最后一个元素的数组倒退。 –

回答

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); 

你可以看到,这导致最显著位被打印的第一。

+0

这是如何工作的我们还没有真正进入功能创建... – TheGreatA

+0

@ArashArbabi看到我的编辑。 – dbush

+0

建议'if(n!= 0)print_binary(n/2); 012fprintf(“%d”,n%2); (n!= 0){ print_binary(n/2); } printf(“%d”,n%2); 'for'print_binary(0)'现在的代码不会打印任何东西。负数是另一个问题,但可能对OP没有兴趣。 – chux

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; 
} 
0

可以数字存储到一个数组,扭转它,以获得正确的号码。

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 
+0

没有必要特别“确保一个孤立的'0'出去”如果循环是一个'do {...} while(掩码);' – chux

+0

@chux我试着'do {} while; '并删除'mask == 1'测试,但没有'0'的输出。我记得你之前已经纠正过我,但是这次循环测试了面具,而不是价值。 –

+0

足够公平,紫外线 – chux