C語言——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()
{
    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碼是啥,只用懂得十進制與十六進制之間的關系就行。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM