C语言长整数转化成16进制字符串pta,【PTA】字符串转换成十进制整数 (15分) #C语言...

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

输入格式:

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

输出格式:

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

输入样例:

+-P-xf4+-1!#

输出样例:

-3905

我的解法:

#include //挺麻烦的,但自认为是比较工整的!已发布CSDN

#include

#include

void Remove_InvalidSympol(char a[],int n){ //去除无效字符

char valid_sympol[]={'-','0','1','2','3','4','5','6','7','8','9','a','A','b','B','c','C','d','D','e','E','f','F'};

int len_right_symbol=strlen(valid_sympol);

int cnt=0;

char temp[1000];

for(int i=0;i

int isinright=0;

for(int j=0;j

if(a[i]==valid_sympol[j]){

isinright=1;

break;

}

}

if(isinright){

temp[cnt]=a[i];

cnt++;

}

}

strcpy(a,temp);

a[cnt]='\0';

}

void Remove_Minus(char a[],int n){ //去除“-”减号

char temp[1000];

int cnt=0;

for(int i=0;i

if(a[i]!='-'){

temp[cnt]=a[i];

cnt++;

}

}

strcpy(a,temp);

a[cnt]='\0';

}

int Change_SymboltoNum(char c){

int num;

switch (c){

case 'a':

case 'b':

case 'c':

case 'd':

case 'e':

case 'f':

num=c-87;

break;

case 'A':

case 'B':

case 'C':

case 'D':

case 'E':

case 'F':

num=c-55;

break;

default: //剩余都是0~9,直接default处理了,小技巧

num=c-48;

break;

}

return num;

}

int main(){

char arr[1000]; //一并读入,并计算长度

gets(arr);

for(int i=0;;i++){

if(arr[i]=='#'){

arr[i]='\0';

break;

}

}

int len_arr=strlen(arr);

Remove_InvalidSympol(arr,len_arr); //筛去无效字符,并更新长度

len_arr=strlen(arr);

int isMinus=0;

if(arr[0]=='-'){ //判断正负,添加负号(X)

isMinus=1; //判断正负,做记号(√)

}

Remove_Minus(arr,len_arr); //筛去“-”,并更新长度

len_arr=strlen(arr);

int decimal_num=0; //Decimal十进制 转化

for(int i=len_arr-1;i>=0;i--){

int each=Change_SymboltoNum(arr[i]); //顺序对应,小坑

decimal_num+=pow(16,len_arr-i-1)*each;

}

if(decimal_num!=0&&isMinus){ //大坑!!没有“-0”一说!!需判断

printf("-");

}

printf("%d",decimal_num);

return 0;

}

收获:

1.去除无效字符,脑子太直了,完全可以用>,

a>='0' && a<='9'

a>='a' && a<='f'

a>='A' && a<='F'

2.不用查ASCII码,直接:

c-‘a’

c-‘A’

3.逐个读入字符:

while(scanf("%c",&a),a!='#'){

/*    code    */

}

4.大坑!!没有“-0”一说!!需判断

改进版:

(待更)

标签:字符,15,十六进制,int,decimal,PTA,C语言,&&,include

来源: https://blog.csdn.net/m0_46240809/article/details/104759676

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值