C语言——BCD解密

lsfreeing 2020-05-05

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;
 }

但是得出结果为

C语言——BCD解密

也就是当我输入的数为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码是啥,只用懂得十进制与十六进制之间的关系就行。

相关推荐