综述:

        本题整体思路很容易想到,但是具体实现起来倒是特别容易出错误,本篇博客就易犯错误以及解题思路两方面对该题进行总结。


目录

综述:

题目:

输入格式:

输出格式:

输入样例:

输出样例: 

一、解题思路:

二、代码: 

三、易错分享:   

易错点1:

易错点2:

总结:


题目:

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

输入格式:

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

输出格式:

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

输入样例:

+-P-xf4+-1!#

输出样例: 

 -3905


一、解题思路:

        对于,PTA的题我个人喜欢按它的步骤来,如果思路不清晰的我是先从它给的输出输出例子来,先解决特殊情况的输入输出,再进行普适性例子的输入输出,这种循序渐进起来做题会简单一点。 

        这道字符串转换成十进制整数的题,思路还是很容易想到的,大致分为一下以下几个步骤:

1、输入一串字符,'#' 表示结束,首先需要定义一个字符数组arr[]存放输入的字符串,输出我用的getchar()和while()循环判断,其中getchar()如果作为while()循环条件是非常容易出错的。

2、题目要求在第一个十六进制字符之前存在字符“-”,最后输出的10进制数就为负数,第二步是找到arr[]中第一个16进制数的下标存放到tmp变量中,然后从0位置遍历到tmp位置,如果存在 '-' 就使得标志位flag变成1,这个在最后用来判断正负。

3、第三步需要把arr[]数组中的16进制的字符0~9以及'A'~'F' 和 'a'~'f' ,找出来并且存放到一个新的数组arr2[] 中,并且记录有几个符合条件的字符。

4、因为,题目不要求区分大小写,所以为了方便后续 操作,将数组中的小写字符全部转化成对应的大写字符,这个步骤十分简单哈,只要知道ASCII表就OK。

5、这一步是非常重要的一步,问题就变成了如何将arr2[]中的这些字符,转换成10进制的数,这也是要分为几个小步骤,首先得要知道这个字符对应的数字是多少,对于字符'0'~'9',只需要减去'0'的值就是它应该对应的数字,对于'A'~'F',就减掉55,这里不做解释,同样看ASCII表。

typescript 字符串转换 字符串转换pta_易错点

        以上这5步就是我做题的思路啦,自我感觉虽然挺啰嗦不精简,但是整体思路是很循序渐进的而且也特别容易理解,嘿嘿。

typescript 字符串转换 字符串转换pta_c语言_02

二、代码: 

#include <stdio.h>
#include <string.h>

int mypow(int x,int y)
{
	//x 的 y次方
	int i = 0;
	if (y == 0)
	{
		return 1;
	}
	else if (y == 1)
	{
		return x;
	}
	else
	{
		int p = x;
		for (i = 0; i < y-1; i++)
		{
			p = p * x;
		}
		return p;
	}

}
int main()
{
	char arr[30];
	memset(arr, '\0', sizeof(arr));
	int i = 0;
	int tmp = 0;//存放第一个十六进制字符下标
	do //易错点1:正确输入字符串
	{
		arr[i] = getchar();
		i++;
	} while (arr[i-1] != '#');

	char arr2[20];
	int count = 0;
	memset(arr2, '\0', sizeof(arr2));
	for (int j = 0; j < i; j++)
	{
		if ((arr[j] >= '0' && arr[j] <= 'F') || (arr[j] >= 'a' && arr[j] <= 'f'))
		{
			tmp = j;
			break;
		}
	}
	int flag = 0;//16进制前面 - 为0,有为1
	for (int j = 0; j < tmp; j++)
	{
		if (arr[j] == '-')
		{
			flag = 1;
			break;
		}
	}

	for (int j = 0; j < i; j++)
	{
		if ((arr[j] >= '0' && arr[j] <= '9') || (arr[j] >= 'a' && arr[j] <= 'f') || (arr[j] >= 'A' && arr[j] <= 'F'))
		{
			arr2[count++] = arr[j];//存储16进制字符
		}
	}
	for (int j = 0; j < count; j++)
	{
		if (arr2[j] >= 'a' && arr2[j] <= 'f')
		{
			arr2[j] = arr2[j] - 32;
		}
	}
	int sum = 0;
	for (int j = 0; j < count; j++)
	{
		if (arr2[j] <= '9' && arr2[j] >= '0')
		{
			sum = sum + (arr2[j] - '0')*mypow(16, count - j - 1);
		}
		else
		{
			sum = sum + (arr2[j] - 55)*mypow(16, count - j - 1);
		}
	}
	if (flag)
	{
		printf("%d", -1 * sum);
	}
	else
	{
		printf("%d", sum);
	}
	return 0;
}

三、易错分享:   

易错点1:

        第一个点是getchar()的使用,一定要注意这个函数是从标准输入流读入,也就是键盘读入,你用一次它一定要读个东西。

typescript 字符串转换 字符串转换pta_易错点_03

易错点2:

        第二个点就是字符0到字符F中间,还有几个别的字符,他们不是连贯起来的。

typescript 字符串转换 字符串转换pta_typescript 字符串转换_04

总结:

        做题之前,不要上来就直接敲代码,还是要先明确一下大致的思路,然后ASCII表也需要稍微知道点,然后就没啥了,中规中矩的一个题。

github:https://github.com/suntong-1221/c-code