输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。
输入格式:
输入在一行中给出一个以#结束的非空字符串。
输出格式:
在一行中输出转换后的十进制数。题目保证输出在长整型范围内。
输入样例:
±P-xf4±1!#
输出样例:
-3905
在这里插入代码片
#include<stdio.h>
#include<string.h>
#include<math.h>
int num(char);
int main()
{
char str[1000],str1[1000];
gets(str);
int i=0,k=0;
//过滤带符号的 不要忘记I++
while(str[i]!='\0'){
if((str[i]>='A'&&str[i]<='F')||(str[i]>='a'&&str[i]<='f')||(str[i]>='0'&&str[i]<='9')||str[i]=='-'){
str1[k]=str[i];
k++;
}
i++;
}
//如果第一个字符是-号
int flag=1;
if(str1[0]=='-')
flag=-1;
//初始化 过滤不带负号
k=0;
i=0;
while(str[i]!='\0'){
if((str[i]>='A'&&str[i]<='F')||(str[i]>='a'&&str[i]<='f')||(str[i]>='0'&&str[i]<='9')){
str1[k]=str[i];
k++;
}
i++;
}
int sum=0;//i控制幂次 j控制数组取值 不许定义为%d 否则会报错
for(int j=k-1,i=0;j>=0;i++,j--){
if(str1[j]>='0'&&str1[j]<='9'){
sum+=(str1[j]-48)*pow(16,i);
}else{
sum+=num(str1[j])*pow(16,i);
}
}
printf("%d",flag*sum);
return 0;
}
int num(char c){
if(c=='a'||c=='A')
return 10;
if(c=='b'||c=='B')
return 11;
if(c=='c'||c=='C')
return 12;
if(c=='d'||c=='D')
return 13;
if(c=='e'||c=='E')
return 14;
if(c=='f'||c=='F')
return 15;
}
版权声明:本文为qq_35643146原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。