输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。
输入格式:
输入在一行中给出一个以#结束的非空字符串。
输出格式:
在一行中输出转换后的十进制数。题目保证输出在长整型范围内。
输入样例:
+-P-xf4+-1!#
输出样例:
-3905
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
解题
这道题其实也就是考16进制转10进制,感觉跟数组也没多大必要的关系,这题目质量关联度也不是很高说实在的。最简朴的办法其实也是最容易的办法。
16进制转10进制要注意几个问题:
10进制是十个数字,1,2,3,4,5,6,7,8,9
16进制是十六个数字,1-9,A,B,C,D,E,F
十进制中的10等于在十六进制中的A;
十进制中的11等于在十六进制中的B;
十进制中的12等于在十六进制中的C;
十进制中的13等于在十六进制中的D;
十进制中的14等于在十六进制中的E;
十进制中的15等于在十六进制中的F;
那么,我们需要注意三种情况:
第一种:字符输入的是0-9数字
直接不用转换,同样适用于16进制,但需要注意一点,我们应该通过循环把“从高位往低位输入的字符数字”,再放回到高位。代码写起来也很简单。
scanf("%c",&a);
while(a!='#')
↑大前提,在循环里。
//前提条件,sum=0
if(a>='0'&&a<='9'){
sum=sum*16+a-'0';}
第二种: 字符输入的是a-f
这一行代码中的'a'
表示小写字母a
的ASCII码值,因此减去'a'
的ASCII码值可以得到小写字母的值。加上10是因为十六进制数中有10个数字和6个字母,因此需要加上10来得到正确的十进制数值。
if(a>='a'&&a<='f'){
sum=sum*16+a-'a'+10; }
第三种:字符输入的是A-F
和第二种是一样的,十六进制数中有10个数字和6个字母,这六个字母不分大小写,都可以正确转换10进制,只是大写字母代表的ASCII码与小写字母不同,稍作修改即可。
if(a>='A'&&a<='F'){
sum=sum*16+a-'A'+10; }
重点大概就是这些,下面是所有代码:
#include<stdio.h>
int main()
{
char a;
int flag=1,mark=0,sum=0;
//flag来表示有没有读到第一个字符,mark来表示第一个字符是不是'-'
scanf("%c",&a);
while(a!='#')
{
if(a>='0'&&a<='9'){
flag=0;
sum=sum*16+a-'0';
}else if(a>='a'&&a<='f'){
flag=0;
sum=sum*16+a-'a'+10;
}else if(a>='A'&&a<='F'){
flag=0;
sum=sum*16+a-'A'+10;
}else if(a=='-'&&flag==1)
mark=1;
scanf("%c",&a);
}
if(sum==0)
printf("0");
else
{
if(mark==1)
printf("-");
printf("%d\n",sum);
}
return 0;
}
思路图:
到此,这道题剖析得没什么问题了。
敲着代码,我妈走进房间和我闲聊了一会儿。她好像想起来什么,问我说,某某某最近怎么样了?
我说,没怎么联系了,应该生活的还挺好的。
等她走了,转过头,眼泪却止不住地流。