一.题目
二.分析与思路
进制的转换就涉及到进制的定义了,就拿我们常用的十进制来讲,其实是用以十为底的位数次幂的和,比如10086就是:
以此类推,二进制的数也可以表示成类似的形式,而最终的答案就是十进制的数,比如0110:
大于十的进制数因为没有可用的阿拉伯数字了,就用字母代替:a就是10,b就是11,以此类推,注意,本题不是完全的进制转换,而是将每一个16进制的数转化成10进制累加即可,这减小了许多难度。在转化过程中,数字没有问题,直接累加即可,而对于字母则应该转化成数字才能累加,不怕麻烦的同学可以使用swich函数,但是由于示例中的字符串大小写不敏感,所以保守要写12个分支,更不用说用if-else语句了,更加麻烦。所以,我们采用将每个字母向对应的ASCLL值进行类型转换,这样就得到整数了,注意大写小写处理有所差别,ASCLL表如下:
有了这个表,我们便可以写出代码,核心思路是先判断字符是否是在0~9,a~f,A~F,之间,如果在,就按照三个不同区间转化为十进制累加,如果不是记录一次,最后如果不是的数量和总数相等,说明没有正确格式的16进制字符,不相等,就输出答案即可。(不能根据答案变量是不是0来判断,因为答案可能就是0);
三.代码实现
#include<bits/stdc++.h>//万能头文件
#define MAX 51//宏定义,最大值
int main()
{
char s[MAX];//储存字符串
scanf("%s",s);
int l=strlen(s);//获取字符串长度
int ans=0;//储存答案
int num=0;//储存非法字符数量
for(int i=0;i<l;i++){
if(s[i]>='0'&&s[i]<='9')ans+=s[i]-'0';//数字类型转换(数字也是字符,转换后才能用)
else if(s[i]>='a'&&s[i]<='f')ans+=s[i]-'a'+10;//小写类型转换
else if(s[i]>='A'&&s[i]<='F')ans+=s[i]-'A'+10;//大写类型转换
else{
num++;
}
}
if(num==l)printf("NO");
else printf("%d",ans);
return 0;
}
四.评价
这道题主要考察类型转换,进制的考察不深入,难度不大,熟练掌握ASCLL表。