iT邦幫忙

2021 iThome 鐵人賽

DAY 26
0
自我挑戰組

用 C & C++ 帶你手把手解 UVa 一顆星選集系列 第 26

Day 0x1A UVa10931 Parity

題意

  • 輸入整數 I,輸出二進位表示法與 parity
  • 需要注意的有:
    1. 重複輸入一整數 I 直到 0
    2. 什麼是 parity
      • 每個 bit 的總和
      • e.g. 21 = 101012 → 3

        其實我看不懂題目後面還有寫 or 1 是什麼意思 QAQ

    3. 輸出格式
      • The parity of B is P (mod 2).
      • BI 的二進位表示法
      • P 就是 parity

解法

  • 先用 while 迴圈讀入整數 I 直到 0
    int I, P;
    
    while(scanf("%d", &I) && I){
        ...
    }
    
  • while 迴圈每次都透過 % 2 檢查奇偶 (代表最後一位 0 or 1),並存放到字元陣列裡,並計算 parity 的次數
    char B[50] = {0};
    P = 0;
    k = 0;
    while(I > 0){
        if(I % 2){
            B[k] = '1';
            P++;
        }
        else{
            B[k] = '0';
        }
        k++;
        I = I / 2;
    }
    
  • 因為存放是從第 0 位開始,要逆著輸出結果

    用字元陣列就是因為原本想用 strrev() 來偷懶
    結果好像因為 Judge 的環境問題
    蠻高機會有可能不支援 QAQ
    而且多餘的 0 也會被輸出

    // printf("The parity of %s is %d (mod 2).\n", strrev(B), P);
    printf("The parity of ");
    for(i = strlen(B) - 1; i >= 0; i--){
        printf("%c", B[i]);
    }
    printf(" is %d (mod 2).\n", P);
    
  • C code ver. 1
    #include<stdio.h>
    #include<string.h>
    
    int main(){
    
        int I, P;
        int k;
        int i;
    
        while(scanf("%d", &I) && I){
            char B[50] = {0};
            P = 0;
            k = 0;
            while(I > 0){
                if(I % 2){
                    B[k] = '1';
                    P++;
                }
                else{
                    B[k] = '0';
                }
                k++;
                I = I / 2;
            }
            // printf("The parity of %s is %d (mod 2).\n", strrev(B), P);
            printf("The parity of ");
            for(i = strlen(B) - 1; i >= 0; i--){
                printf("%c", B[i]);
            }
            printf(" is %d (mod 2).\n", P);
        }
    
        return 0;
    }
    
  • 也可以透過 Bitwise Operation 的概念解,& 1 一樣會使結果只有 0 or 1,每次都右移一個,檢查最右位元
    int P = 0;
    int bit[31] = {0};
    
    for(i = 0; I > 0; i++){
        if(I & 1){
            P++;
        }
        bit[i] = I & 1;
        I >>= 1;
    }
    
  • C code ver. 2
    #include<stdio.h>
    
    int main(){
    
        int I;
        int i, j;
    
        while(scanf("%d", &I) && I){
    
            int P = 0;
            int bit[31] = {0};
    
            for(i = 0; I > 0; i++){
                if(I & 1){
                    P++;
                }
                bit[i] = I & 1;
                I >>= 1;
            }
    
            printf("The parity of ");
            for(j = i - 1; j >= 0; j--){
                printf("%d", bit[j]);
            }
            printf(" is %d (mod 2).\n", P);
        }
    
        return 0;
    }
    

上一篇
Day 0x19 UVa10929 You can say 11
下一篇
Day 0x1B UVa10922 2 the 9s
系列文
用 C & C++ 帶你手把手解 UVa 一顆星選集30

尚未有邦友留言

立即登入留言