BCD數是用一個字節來表達兩位十進制的數,每四個比特表示一位。所以如果一個BCD數的十六進制是0x12,它表達的就是十進制的12。但是小明沒學過BCD,把所有的BCD數都當作二進制數轉換成十進制輸出了。於是BCD的0x12被輸出成了十進制的18了!
現在,你的程序要讀入這個錯誤的十進制數,然后輸出正確的十進制數。提示:你可以把18轉換回0x12,然后再轉換回12。
輸入格式:
輸入在一行中給出一個[0, 153]范圍內的正整數,保證能轉換回有效的BCD數,也就是說這個整數轉換成十六進制時不會出現A-F的數字。
輸出格式:
輸出對應的十進制數。
輸入樣例:
18
輸出樣例:
12
最開始我的想法是將輸入的那個數轉換成十六進制的數,這樣我就可以得到結果了。
#include<stdio.h> int main() { int num=0; int a[100]; int i=0; int m=0; int b; char hex[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; scanf("%d",&num); while(num>0) { b=num%16; a[i++]=b; num=num/16; } // printf("轉化為十六進制的數為:0x"); for(i=i-1;i>=0;i--) { m=a[i]; printf("%c",hex[m]); } printf("\n"); return 0; }
但是得出結果為
也就是當我輸入的數為0時,這個程序就是錯的。
最后我查了一下別人的程序,如下:
#include <stdio.h> int main() { int num,num1,num2; scanf("%d",&num); num1=num/16; num2=num%16; printf("%d",num1*10+num2); return 0; }
??????就這樣??????(滿臉問號)
總結:對於這題,我最先是對BCD碼的不理解,於是我去百度了一下。懂了BCD碼后,我又來做這道題,我的思路是先將數轉換成十六進制,再將十六進制轉換成BCD碼,最后再轉成十進制,要不是十六進制轉換成BCD碼太過於復雜,我可能真的會這樣做。最后我搜了別人的答案之后,我才發現我想的太復雜了,這道題也根本不用理解BCD碼是啥,只用懂得十進制與十六進制之間的關系就行。