2016-11-04 71 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