【问题描述】输入一个以'#'结束的字符串,滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数的字符串,然后将其转化为十进制数后输出。如果过滤后字符串的首字符为'-',代表的是负数。
【输入形式】一个字符串
【输出形式】一个十进制整数
【样例输入】+P-xf4+-1!#
【样例输出】-3905
【样例说明】输入的内容,按十六进制数要求将数值(0~9,A~E)和符号(在数值之前的'-')保留,得到-f41,转换为十进制后是-3905
【评分标准】
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
char a[80];
int i=0;
while(i < 80 && (a[i]=getchar())!='#'){
i++;
}
char b[100];
int flag1=0,flag2=0,cnt=0;
for(int j=0;j<i;j++){
if(a[j]=='-'&&flag2==0){
flag1=1;
}
if((a[j]>='A'&&a[j]<='F')||(a[j]>='a'&&a[j]<='f')||(a[j]>='0'&&a[j]<='9')){
flag2=1;
b[cnt]=a[j];
cnt++;
}
}
int sum=0;
int power = cnt - 1;
for(int j=0;j<cnt;j++){
int digit = 0;
if(b[j]>='A'&&b[j]<='F'){
digit = b[j]-'A'+10;
}
else if(b[j]>='a'&&b[j]<='f'){
digit = b[j]-'a'+10;
}
else if(b[j]>='0'&&b[j]<='9'){
digit = b[j]-'0';
}
sum += digit * pow(16, power);
power--;
}
if (flag1 == 1) {
sum *= -1;
}
cout<<sum;
return 0;
}
-
输入读取和处理:
- 通过
getchar()
逐个读取字符,将字符存储在阵列a
中,直到输入的为字符#
或者阵列a
已满(通过边界检查i < 99
)。 - 在处理输入字符时,将有效的字符存储到数据库
b
中,该数据库用于保存可能构成十六个字符的字符。
- 通过
-
有效字符提取:
- 通过传输
a
中的字符,筛选出可能构成十六个轮数的字符,并存储到阵列b
中。这些字符包括大写字母 A 到 F(或小写字母 a 到 f)和数字 0 到 9。
- 通过传输
-
十六轮转十轮:
- 对队列
b
中的字符进行处理,根据字符的类型(字母或数字),计算其对应的十进制数值。通过计算pow(16, power)
每个字符的权重,然后累加到sum
中。
- 对队列
-
负数处理:
- 通过
flag1
标志来检查输入中是否存在负号-
,如果存在负号,则在最后将计算得到的sum
取反。
- 通过
-
输出结果:
- 最后通过
cout
输出累加后的十间歇值sum
。
- 最后通过
总的来说,设想代码旨在读取输入字符,并尝试将这些字符解释为十六进制数的表示,将其转换为十进制并累加,最后输出累加结果。但需要注意的是,此代码在处理负数和负号位置时可能存在一些逻辑上的问题,特别是在寻找负号位置的位置。