首页 > 试题广场 >

字符串转换成十进制整数。输入一个以字符“#”结束的字符串,滤

[问答题]

字符串转换成十进制整数。输入一个以字符“#”结束的字符串,滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果过滤后字符串的首字符为“-”,代表该数是负数。试编写相应程序。

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main() {
    int c = 0, s = 0, num = 0;
    char ch[80], six[80];
    while ((ch[c++] = getchar()) != '#') {// 键盘输入的字符串填充ch数组
        /*six数组从ch数组中过滤掉非十六进制的字母*/
        if ((ch[c - 1] >= 'A' && ch[c - 1] <= 'F') ||
            (ch[c - 1] >= 'a' && ch[c - 1] <= 'f') ||
            six[s - 1] >= '0' && six[s - 1] <= '9' ||
            ch[c - 1] == '-') {
            six[s++] = ch[c - 1];
            /*过滤后的十六进制字母转为十进制数*/
            if (six[s - 1] >= 'A' && six[s - 1] <= 'F') {
                num = num * 16 + six[s - 1] - 'A' + 10;
            } else if (six[s - 1] >= 'a' && six[s - 1] <= 'f') {
                num = num * 16 + six[s - 1] - 'a' + 10;
            } else if (six[s - 1] >= '0' && six[s - 1] <= '9') {
                num = num * 16 + six[s - 1] - '0' + 10;
            }
        }
    }
    /*判断正负*/
    if (six[0] == '-') {
        printf("%d\n", -num);
    } else {
        printf("%d\n", num);
    }
    return 0;
}

发表于 2021-02-09 18:18:52 回复(0)

#include <stdio.h>  
#include <string.h> 
#include<math.h>
int num(char s);
//输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,
//然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。
 //  例子 ; +-P-xf4+-1!#  第一个十六进制  是F 之前有- 滤掉过后就是 -f41 = -3905 
int main()  
{       //输入在一行中给出一个以#结束的非空字符串。
    char a[800],b[800]; //b数组用来存放过滤后的字符 
    int d,i,j,k;
    
    i=0;
    while((d=getchar())!='#'){
        a[i]=(char)d;
        i++;
    }
    a[i]='\0';
    
    //过滤有‘-’ 的值 
    int p;
    p=i;
    k=0; 
    for(i=0;i<p;i++){
        if((a[i]>='0'&&a[i]<='9')||(a[i]>='a'&&a[i]<='f')||(a[i]>='A'&&a[i]<='F')||a[i]=='-'){
            b[k]=a[i];
            k++;
        }
    }
    
    int flag=1;
    if(b[0]=='-') flag=-1; //判断 第一个字符是否为 -
    
    //重新过滤没有‘-’ 的值 
    k=0;
    for(i=0;i<p;i++){
        if((a[i]>='0'&&a[i]<='9')||(a[i]>='a'&&a[i]<='f')||(a[i]>='A'&&a[i]<='F')){
            b[k]=a[i];
            k++;
        }
    }    
    
    int sum=0;
    for(i=k-1,j=0;i>=0;i--,j++){   //i 控制幂次 j控制位数 因为 f41  第一位的要乘的数的幂次为f*16的2次方 
         if(b[j]>='0'&&b[j]<='9'){
            sum=sum+(b[j]-48)*pow(16,i);  //(b[j]-48) 将字符转化为相对应的数字; 
        }else{
            sum=sum+num(b[j])*pow(16,i);   
        }
    
    printf("%d",sum*flag);
    return 0;  
  

int num(char s)
{
    if(s == 'a'||s == 'A')
        return 10;
    if(s == 'b'||s == 'B')
        return 11;
    if(s == 'c'||s == 'C')
        return 12;
    if(s == 'd'||s == 'D')
        return 13;
    if(s == 'e'||s == 'E')
        return 14;
    if(s == 'f'||s == 'F')
        return 15;
}

发表于 2018-12-18 17:00:24 回复(1)