问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535
1.这道题的一个通用思路,首先获得数的十六进制表示,然后分别将每个数位表示为十进制,数位展开求和,并输出。
(1)考虑输入,可以用一个字符数组存储输入的十六进制字符串,char a[8];
(2)考虑数位转化,可以用一个整形数组存储转换为十进制表示的数位,int b[8];
(3)考虑数位展开,可以定义一个展开函数,主函数中只需要将数位与展开函数的结果相乘,定义一个long num,累加。
(4)将结果输出。
如果只考虑出题范围,许多问题可以不进行讨论。
#include<stdio.h>
int main()
{
char a[8]; //存储十六进制字符
int b[8]; //存储各个数位的十进制表示
int i,j=0;
long num=0;//存储求和结果
for(i=0;i<8;i++) //最多输入8位
{
scanf("%c",&a[i]);
if((a[i]=='\n')||(a[i]=='\0')) //如果输入字符是空格或者回车,结果输入
{
break;
}
}
printf("%c\n",a[j]); //测试输入
printf("%d\n",i); //测试
for(j=0;j<i;j++) //数位展开,并赋给int b
{
if((a[j]<='9')&&(a[j]>='0'))
{
b[j]=a[j];
}
switch(a[j])
{
case 'A':
b[j]=10;
break;
case 'B':
b[j]=11;
break;
case 'C':
b[j]=12;
break;
case 'D':
b[j]=13;
break;
case 'E':
b[j]=14;
break;
case 'F':
b[j]=15;
break;
default:
break;
}
}
for(j=0;j<i;j++) //测试
{
if(b[j]<=15&&b[j]>=0) //本题中可以省略,过滤错误输入
{
printf("%d\n",b[j]);
}
}
return 0;
}
上面,我们将十六进制代码输入,并将各个数位转换为十进制,并做了一些数据测试。
下面我们来定义一个数位展开函数。
int getNum(int i)
{
int j=0,num1=1;
while(i-j>0)
{
num1*=16;
j++;
}
return num1;
}
我们将数组a[j]中每个元素的索引相关量传入getNum函数,如果i=3,索引为0的数位需要乘16的立方,定义一个m,m=i-j,将m传入getNum函数。
那么,num=num+b[j]*getNum(m)
完整代码如下:
#include<stdio.h>
long long getNum(int i)
{
long long num1=1;
while(i>0)
{
num1*=16;
i--;
}
return num1;
}
int main()
{
char a[9];
long b[8];
int i,j=0;
long long num=0;
for(i=0;i<8;i++)
{
scanf("%c",&a[i]);
if((a[i]=='\n')||(a[i]=='\0'))
{
break;
}
}
for(j=0;j<i;j++)
{
if((a[j]<='9')&&(a[j]>='0'))
{
switch(a[j])
{
case '0':
b[j]=0;
break;
case '1':
b[j]=1;
break;
case '2':
b[j]=2;
break;
case '3':
b[j]=3;
break;
case '4':
b[j]=4;
break;
case '5':
b[j]=5;
break;
case '6':
b[j]=6;
break;
case '7':
b[j]=7;
break;
case '8':
b[j]=8;
break;
case '9':
b[j]=9;
default:
break;
}
}
switch(a[j])
{
case 'A':
b[j]=10;
break;
case 'B':
b[j]=11;
break;
case 'C':
b[j]=12;
break;
case 'D':
b[j]=13;
break;
case 'E':
b[j]=14;
break;
case 'F':
b[j]=15;
break;
default:
break;
}
}
if(i==1)
{
num=b[0];
}
if(i>1)
{
for(j=0;j<i;j++)
{
num+=b[j]*(getNum(i-j-1));
}
}
printf("%I64d",num);
return 0;
}