字符串转换成十进制整数(1-72) —进制转换
题目描述:
输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。
输入:
输入在一行中给出一个以#结束的非空字符串。
输出:
在一行中输出转换后的十进制数。题目保证输出在长整型范围内。
输入样例:
复制代码
1
2+-P-xf4+-1!#
输出样例:
复制代码
1
2-3905
题目来源:
ECNU_DASE_OJ_1-72
思路/题点:
- 在输入字符串的过程中判断是否是合法的16进制字符,如果是放入字符串中,否则不做处理。
- 要处理正负号:用两个判断标记,如果该字符属于16进制字符,标记flag1=true,表示转换数大于0,如果不属于16进制字符但等于‘-’,就判断flag1是否为true,如果flag1为fasle代表第一个16进制字符前存在‘-’。如果flag1和flag2同时为true就输出‘-’。
- 在16进制转换为10进制的过程中,遇到字符a-f和A-F如何处理呢,要转换成对应的数字代入运算,还要制定转换规则,区分大小写字母。因为只有12个字母要转成数字所以用简单粗暴的switch语句处理了。然后还有在输入的时候的数字是字符,进制运算时要用数字,转换规则为‘数字’-‘0’=数字。
题解代码
纯C语言(OJ只给了C语言提交方式)
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52#include<stdio.h> char str[10010]; int JudeIsH(char n){ if(n>='0' && n<='9' || n>='A' && n<='F' || n>='a' && n<='f') return 1; else return 0; } int main(){ char c; long long n=0; int flag1=0; int flag2=0; int la=0; while(~scanf("%c",&c) && c!='#'){ if(JudeIsH(c)) { str[la++]=c; flag1=1; } else if(c=='-' && !flag1) flag2=1; } if(flag2 && flag1)//负号的处理 printf("-"); int product =1; for(int i=la-1;i>=0;i--){ switch(str[i])//处理各字符转成对应数字 { case 'A': case 'a': str[i]=10;break; case 'B': case 'b': str[i]=11;break; case 'C': case 'c': str[i]=12;break; case 'D': case 'd': str[i]=13;break; case 'E': case 'e': str[i]=14;break; case 'F': case 'f': str[i]=15;break; default: str[i]-='0';break; } n+=str[i]*product; product*=16; } printf("%lld",n); return 0; }
C++代码
与C语言不同的地方:使用了bool类型,使用了vector容器,因为vector支持基本操作的方法。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52#include<cstdio> #include<vector> using namespace std; bool JudeIsH(char n){ if(n>='0' && n<='9' || n>='A' && n<='F' || n>='a' && n<='f') return true; else return false; } int main(){ char c; vector<char> v; long long n=0; bool flag1=false; bool flag2=false; while(~scanf("%c",&c) && c!='#'){ if(JudeIsH(c)) { v.push_back(c); flag1=true; } else if(c=='-' && !flag1) flag2=true; } if(flag1 && flag2) printf("-"); int product =1; for(int i=v.size()-1;i>=0;i--){ switch(v[i]){ case 'A': case 'a': v[i]=10;break; case 'B': case 'b': v[i]=11;break; case 'C': case 'c': v[i]=12;break; case 'D': case 'd': v[i]=13;break; case 'E': case 'e': v[i]=14;break; case 'F': case 'f': v[i]=15;break; default: v[i]-='0';break; } n+=v[i]*product; product*=16; } printf("%lld",n); return 0; }
最后
以上就是潇洒小懒虫最近收集整理的关于字符串转换成十进制整数(1-72) ---进制转换字符串转换成十进制整数(1-72) —进制转换的全部内容,更多相关字符串转换成十进制整数(1-72)内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复