如何从右到左制作printf

时间:2016-11-04 19:34:43

标签: c

我已经编写了这个代码,用于将十进制数转换为二进制数,但是它打印数字反之亦然,我该如何才能使这个工作? 我可以使用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;
}

4 个答案:

答案 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)

您可以将数字存储到数组中,然后将其反转,以获得正确的数字。