1. 程式人生 > >【C/C++程式碼練習27】PTA BCD解密

【C/C++程式碼練習27】PTA BCD解密

BCD數是用一個位元組來表達兩位十進位制的數,每四個位元表示一位。所以如果一個BCD數的十六進位制是0x12,它表達的就是十進位制的12。但是小明沒學過BCD,把所有的BCD數都當作二進位制數轉換成十進位制輸出了。於是BCD的0x12被輸出成了十進位制的18了!

現在,你的程式要讀入這個錯誤的十進位制數,然後輸出正確的十進位制數。提示:你可以把18轉換回0x12,然後再轉換回12。

輸入格式:

輸入在一行中給出一個[0, 153]範圍內的正整數,保證能轉換回有效的BCD數,也就是說這個整數轉換成十六進位制時不會出現A-F的數字。

輸出格式:

輸出對應的十進位制數。

輸入樣例:

18

輸出樣例:

12

此題解法如下:

#include <stdio.h> 

int main(void)
{
    int x; 
    scanf("%d", &x); // 讀入一個數
    
    // 將讀入的數字轉換為二進位制數
    int p=1, y=0, yushu=0; 
    while(1)
    {
        yushu = x % 2; 
        x = x / 2; 
        y = y + yushu*p; 
        p = p * 10; 
        if(x < 2)
        {
            y = y + x*p; 
            break; 
        }
    }
    //printf("%08d\n", y); // 輸出以便檢視轉換結果
    int a,b;  // 變數a保留低4位位元,變數b保留高4位位元
    a = y % 10000; 
    b = y / 10000; 
    
    int a1, a2, a3, a4; // 分離出低4位位元的每一位
    a1 = a % 10; 
    a2 = a / 10 % 10; 
    a3 = a / 100 % 10; 
    a4 = a / 1000; 
    int sum_a; 
    sum_a = 8*a4 + 4*a3 + 2*a2 + 1*a1; // 計算低4位的值
    //printf("%04d %d %d %d %d %d\n", a,a4,a3,a2,a1,sum_a); 
    int b1, b2, b3, b4; // 分離出高4位位元的每一位
    b1 = b % 10; 
    b2 = b / 10 % 10; 
    b3 = b / 100 % 10; 
    b4 = b / 1000; 
    int sum_b; 
    sum_b = 8*b4 + 4*b3 + 2*b2 + 1*b1; // 計算高4位的值
    //printf("%04d %d %d %d %d %d\n", b,b4,b3,b2,b1,sum_b); 
    
    int sum; 
    sum = sum_b * 10 + sum_a; 
    printf("%d\n", sum); 
    
    return 0; 
}

此題另一種解法:

#include<stdio.h>

int main (void)
{
    int x;
    scanf("%d",&x); // 讀入一個數
    
    int a, b; 
    a = x % 16; 
    b = x/16*10 + a; 
    
    printf("%d\n", b); 
  
    return 0;
}