[PTA]实验7-3-6 字符串转换成十进制整数
Posted Spring-_-Bear
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[PTA]实验7-3-6 字符串转换成十进制整数相关的知识,希望对你有一定的参考价值。
输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。
输入格式:
输入在一行中给出一个以#结束的非空字符串。
输出格式:
在一行中输出转换后的十进制数。题目保证输出在长整型范围内。
输入样例:
+-P-xf4+-1!#
输出样例:
-3905
- 提交结果:
- 源码:
#include<stdio.h>
#include<math.h>
int main(void)
{
char str1[80], str2[80]; // str1:原始输入字符串数组; str2:滤去非十六进制字符串数组
int index = 0; // index为字符数组2的下标
int indexFirst; // 第一个十六进制字符在字符数组str[1]中的下标
long sum = 0; // 转换后的十进制数
// 输入字符串,以'#'结尾
for (int i = 0; i < 80; i++)
{
str1[i] = getchar();
if (str1[i] == '#')
{
break;
}
}
// 滤去所有的非16进制字符并存入字符数组str2,从str2[1]开始存储
for (int i = 0; str1[i] != '#'; i++)
{
if (str1[i] >= '0' && str1[i] <= '9' || str1[i] >= 'a' && str1[i] <= 'f' || str1[i] >= 'A' && str1[i] <= 'F')
{
// 从str2[1]开始,将所有的十六进制字符存入数组str2,str[0]暂不用
index++;
str2[index] = str1[i];
}
}
//将所有的十六进制转换为十进制,并实现对转换后十进制数的计算
for (int i = 1; i <= index; i++)
{
if (str2[i] >= '0' && str2[i] <= '9') // 先将十六进制字符'0'-'9'转换为整型数字,再将整型数字转换为16进制
{
sum += (str2[i] - '0') * pow(16, index - i); // 例:f41分别存在第1,2,3下标的数组中,f41则其对应的16次方的幂2分别为2,1,0;则可得出指数为index-i的结论
}
else if (str2[i] >= 'a' && str2[i] <= 'f')
{
sum += (str2[i] - 'a' + 10) * pow(16, index - i); //f41中:转换为十进制为:f*16²+4*16+1,可得出指数的规律为index-i
}
else if (str2[i] >= 'A' && str2[i] <= 'F')
{
sum += (str2[i] - 'A' + 10) * pow(16, index - i);
}
}
// 找到第一个十六进制字符在字符数组str1[]中的下标
for (int i = 0; str1[i] != '#'; i++)
{
if (str1[i] >= '0' && str1[i] <= '9' || str1[i] >= 'a' && str1[i] <= 'f' || str1[i] >= 'A' && str1[i] <= 'F')
{
indexFirst = i;
break;
}
}
// 判断在第一个十六进制字符之前是否存在负号,若有,则存入str2[0]
for (int i = 0; i <= indexFirst; i++)
{
if (str1[i] == '-') // 在第一个十六进制字符之前存在负号
{
str2[0] = '-';
break;
}
}
// 根据str2[0]中是否为字符'-',判断该十进制数num是正数还是负数
if (str2[0] == '-')
{
printf("%d", -sum);
}
else
{
printf("%d", sum);
}
return 0;
}
以上是关于[PTA]实验7-3-6 字符串转换成十进制整数的主要内容,如果未能解决你的问题,请参考以下文章