zoukankan      html  css  js  c++  java
  • 习题7-8 字符串转换成十进制整数

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

    输入格式:

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

    输出格式:

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

    输入样例:

    +-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,再判断它的前一位是不是符号,错上加错,最后咋写都不对,看了看别人的,才发现理解错了,就及时修正。

    最后,写代码还是要写注释,这是一个非常好的习惯,希望大家看到这句话都尽量多写点注释。

    谢谢大家!

  • 相关阅读:
    hdu 1286
    hdu 1420
    hdu 2068
    hdu 1718
    hdu 1231
    hdu 1072
    HDOJ 350留念
    hdu 1898
    hdu 1593
    帮助理解git的图
  • 原文地址:https://www.cnblogs.com/KeithTee/p/13841156.html
Copyright © 2011-2022 走看看