[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 字符串转换成十进制整数的主要内容,如果未能解决你的问题,请参考以下文章

[PTA]习题7-8 字符串转换成十进制整数

字符数组

[PTA]实验10-9 十进制转换二进制

[PTA]实验8-2-10 IP地址转换

[PTA]实验7-3-7 字符转换

[PTA]实验7-3-9 字符串字母大小写转换