目录
题目描述
补充知识:
算法分析
优化算法
写在最后
题目描述
输入一个十六进制数字串,将其转换成为对应的整数并输出转换结果,遇到非十六进制数字或字符串结束符('\0'
)结束转换。
注意: 输入的字符串的长度不会超过100
;转换后的值不会超出int类型的范围。
1.测试输入:
55
//程序的输入不会有十六进制的前缀预期输出:
85
2.测试输入:
f1r2
//程序的输入不会有十六进制的前缀预期输出:
241
补充知识:
十六进制转换为十进制的做法:
算法分析
#include#includevoid conversion(char str[]){/**********Begin**********/int i=0,j=0,num=0,sum=0;int len=strlen(str);while(str[i]!='\0'){if(str[i]>='0'&&str[i]='a'&&str[i]='A'&&str[i]<='F') num=str[i]-'A'+10; else break;for(j=0;j<len-1;j++){num=num*16;}sum+=num; i++;len--;}printf("%d",sum);/**********End**********/}
上面代码不够完善,当遇到一些特殊情况(当出现非16进制的字符的时候)就会出错,例如:
测试输入:
5r
//程序的输入不会有十六进制的前缀预期输出:5
实际输出:80
问题在于:
- 我们使用字符的长度n(程序中以len代替)来决定 5*,r也被记录在内,导致多乘了一个16。
- 而且对循环的结束条件设置的不合理,如果输入的例子为5r123,那么就会被计算为
优化算法
#include#includevoid conversion(char str[]) {/**********Begin**********/int i = 0, j=0,num = 0, sum = 0,len=0;//int len = strlen(str);//这种方法会将非16进制数记录在内while ((str[i] >= 'a' && str[i] = 'A' && str[i] = '0' && str[i] = '0' && str[i] = 'a' && str[i] = 'A' && str[i] <= 'F')num = str[i] - 'A' + 10;elsebreak;//遇到'\0'之前的第一个非十六进制数就停止循环for (j = 0; j < len - 1; j++){num = num * 16;}sum += num;i++;len--;//每读取一位就使长度-1}printf("%d\n", sum);/**********End**********/}
写在最后
点赞,你的认可是我创作的动力!
⭐收藏,你的青睐是我努力的方向!
✏️评论,你的意见是我进步的财富!