PTA数组简单题中最难的一道题:字符串转换成十进制整数

输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。

输入格式:

输入在一行中给出一个以#结束的非空字符串。

输出格式:

在一行中输出转换后的十进制数。题目保证输出在长整型范围内。

输入样例:

+-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;

}

 思路图:

到此,这道题剖析得没什么问题了。

敲着代码,我妈走进房间和我闲聊了一会儿。她好像想起来什么,问我说,某某某最近怎么样了?

我说,没怎么联系了,应该生活的还挺好的。

等她走了,转过头,眼泪却止不住地流。

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Louis Maos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值