西电期末1005.进制转换

一.题目

二.分析与思路

进制的转换就涉及到进制的定义了,就拿我们常用的十进制来讲,其实是用以十为底的位数次幂的和,比如10086就是:

10086_{(10)}=10^{4}\times 1+10^{3}\times 0+10^{2}\times 0+10^{1}\times 8+10^{0}\times 6

以此类推,二进制的数也可以表示成类似的形式,而最终的答案就是十进制的数,比如0110:

0110_{(2)}=2^{3}\times0+2^{2}\times1+2^{1}\times1+2^{0}\times0\\ =6_{(10)}

大于十的进制数因为没有可用的阿拉伯数字了,就用字母代替: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表。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值