输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。
输入格式:
输入在一行中给出一个以#结束的非空字符串。
输出格式:
在一行中输出转换后的十进制数。题目保证输出在长整型范围内。
输入样例:
+-P-xf4+-1!#
输出样例:
-3905
先贴代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<math.h> 5 int main() { 6 int n = 0; //控制字符串b 7 int boo = 1; //1是+ 0是- 8 char a[100]; //a数组是存放输入字符的 9 char b[100]; //b数组是存放符合条件字符的 10 gets(a); 11 int len = strlen(a); 12 for (int i = 0; i < len; i++) { //如果符合条件,就把a的字符放到b中 13 if ((a[i] >= 48 && a[i] <= 57) || (a[i] >= 65 && a[i] <= 70) || (a[i] >= 97 && a[i] <= 102)) { 14 b[n] = a[i]; 15 n++; 16 if (n == 1) { //这里n==1是判断 是不是第一个字符,因为上面n++了,所以此处是1 17 for (int j = 0; j < i; j++) { 18 if (a[j] == 45) { 19 boo = 0; 20 } 21 } 22 } 23 } 24 if (a[i] == '#') { 25 break; 26 } 27 } 28 //printf("%d ",n); 29 if (n == 0) { //这里,如果n==0,说明b数组为空,按照题目要求,应该输出0(不管前面有没有负号) 30 printf("0"); 31 return 0; 32 } 33 if (boo == 0) { //如果前面有符号,这里输出- 34 printf("-"); 35 } 36 37 int lenb = strlen(b); 38 //printf("%d", lenb); 39 int sum = 0; //sum是和 40 n = 0; //n是判断b数组中,各个数字的位置 41 int t = 0; //t是临时变量 42 for (int i = lenb - 1; i >= 0; i--) { 43 if (b[i] == 97 || b[i] == 65) { 44 t = 10; 45 } 46 if (b[i] == 98 || b[i] == 66) { 47 t = 11; 48 } 49 if (b[i] == 99 || b[i] == 67) { 50 t = 12; 51 } 52 if (b[i] == 100 || b[i] == 68) { 53 t = 13; 54 } 55 if (b[i] == 101 || b[i] == 69) { 56 t = 14; 57 } 58 if (b[i] == 102 || b[i] == 70) { 59 t = 15; 60 } 61 if (b[i] >= 48 && b[i] <= 57) { 62 t = b[i] - 48; 63 } 64 sum = sum + t * pow(16, n); 65 n++; 66 } 67 68 printf("%d", sum); 69 return 0; 70 }
代码有注释,就不详细讲解具体的了。
接下来说说思路:
1.先用gets()把用户输入的字符串存到数组a中
2.对数组a进行判断,如果符合条件(是16进制数),就将他存到数组b中。(插一条,如果是第一个符合的数字,再判断它之前有没有负号!!!之前不是前一位,而是全部!!!!!)
3.如果数组b是空的,即说明没有一个符合条件的字符,输出0(题目要求,无论前面有没有负号,都输出0)
4.如果数组b不是空的,就对数组b进行处理,将他的各个位数进行处理(我这里用了比较笨的方法)
5.输出结果!
我这个题目题意理解错了,看到它给的实例,我以为是有一个x或者X进行开头的,(因为16进制数是0x或者0X开头),然后我就直接找第一个X,再判断它的前一位是不是符号,错上加错,最后咋写都不对,看了看别人的,才发现理解错了,就及时修正。
最后,写代码还是要写注释,这是一个非常好的习惯,希望大家看到这句话都尽量多写点注释。
谢谢大家!