习题7-8 字符串转换成十进制整数 (15 分)
输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。
输入格式:
输入在一行中给出一个以#结束的非空字符串。
输出格式:
在一行中输出转换后的十进制数。题目保证输出在长整型范围内。
输入样例:
+-P-xf4+-1!#
输出样例:
-3905
分析:该题输入一串混合型字符,因此主要有几个部分:第一步,从输入字符中筛选出符合条件的字符并保存在s1[ ]中;第二步:依次s1[ ]中读一个判断一个并求和;第三部分:判断正负。
另外,本代码中switch循环判断是一个比较直观的写法,但会显得冗余不够美观,其实更简洁的是利用ascii码,例如:'f' 或者 'F',f - 'a' + 10 或者 F - 'A' + 10; 能够转换成十六进制的数字,然后再循环求和。
代码:
#include<stdio.h>
#include<math.h>
int main()
{
//输入
char s[80];
int i=0;
char s1[80];
int k=0;
while ( (s[i] = getchar() ) != '#')
{
i++;
}
int flag = 1;//判断正负
//过滤后的存储在s1[]中
for(int j=0;j<i;j++)
{
if(k == 0 && s[j] == '-') flag = -1;
if( (s[j] >= '0' && s[j] <= '9') || (s[j]>= 'A' && s[j] <= 'F') || (s[j] >= 'a' && s[j] <= 'f') )
{
s1[k] = s[j];
k++;
}
}
//输出
double sum = 0;
for(int i=0;i<k;i++)
{
switch(s1[i]){
case '0' : sum = sum + pow(16,k-i-1) * 0; continue;
case '1' : sum = sum + pow(16,k-i-1) * 1; continue;
case '2' : sum = sum + pow(16,k-i-1) * 2; continue;
case '3' : sum = sum + pow(16,k-i-1) * 3; continue;
case '4' : sum = sum + pow(16,k-i-1) * 4; continue;
case '5' : sum = sum + pow(16,k-i-1) * 5; continue;
case '6' : sum = sum + pow(16,k-i-1) * 6; continue;
case '7' : sum = sum + pow(16,k-i-1) * 7; continue;
case '8' : sum = sum + pow(16,k-i-1) * 8; continue;
case '9' : sum = sum + pow(16,k-i-1) * 9; continue;
case 'A' : sum = sum + pow(16,k-i-1) * 10; continue;
case 'a' : sum = sum + pow(16,k-i-1) * 10; continue;
case 'B' : sum = sum + pow(16,k-i-1) * 11; continue;
case 'b' : sum = sum + pow(16,k-i-1) * 11; continue;
case 'C' : sum = sum + pow(16,k-i-1) * 12; continue;
case 'c' : sum = sum + pow(16,k-i-1) * 12; continue;
case 'D' : sum = sum + pow(16,k-i-1) * 13; continue;
case 'd' : sum = sum + pow(16,k-i-1) * 13; continue;
case 'E' : sum = sum + pow(16,k-i-1) * 14; continue;
case 'e' : sum = sum + pow(16,k-i-1) * 14; continue;
case 'F' : sum = sum + pow(16,k-i-1) * 15; continue;
case 'f' : sum = sum + pow(16,k-i-1) * 15; continue;
}
}
if(sum == 0) printf("%.0lf\n" ,sum);
else{
printf("%.0lf\n",flag * sum);
}
}