题目
思路
1 输入16进制将16进制中a-e转换成对应数值。
2 将数值对应的2进制编码倒序存储到整形数组中。
3 将整形数组中数值为1的值的标作为2的次方数得到数。
4 将数字相加。
代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int cheng(int a) //用于实现2的a次方数值返回.
{
int i=0,sum=2;
if(a==0)
return 1;
else if(a==1)
return 2;
for(i=1;i<a;i++)
sum*=2;
return sum;
}
int main()
{
char a[1000]; //用于存储输入的16进制数
int a1[1000]={0}; //用于将16进制对应的2进制倒叙存储
int b1[16][4]={{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},{0,1,0,0},{0,1,0,1},{0,1,1,0},{0,1,1,1},{1,0,0,0},{1,0,0,1},{1,0,1,0},{1,0,1,1},{1,1,0,0},{1,1,0,1},{1,1,1,0},{1,1,1,1}};
// b1二维数组是一个对照表,16进制转2进制的对照表
scanf("0x%s",a);
int i=0;
while(a[i]!='\0') //获取16数进制长度
{i++;}
i--;
int m=0,h=0;
for(;i>=0;i--) //将16进制的abcdef转换成数字的10,11,12,13,14,15为了方便从b1中获取16进制对应的二进制数。
{
if(a[i]>='0'&&a[i]<='9')
m=(int)a[i]-'0';
else
m=(int)a[i]-'A'+10;
int j=3;
for(;j>=0;j--) //b1的二进制数传输给a1从0号位置开始
{
a1[h++]=b1[m][j];
}
}
int i1=0,sum=0;
for(;i1<h;i1++) //当a1下标对应的值为1时将下标穿给cheng函数获取数值并相加
{
int m=0;
if(a1[i1]==1)
{
m=cheng(i1);
sum+=m;
}
else
continue;
}
printf("%d\n",sum);
}