【C/C++程式碼練習27】PTA BCD解密
阿新 • • 發佈:2019-01-03
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;
}