【蓝桥杯】1434:回文数字—>三种判断回文的方法

前言:

通过对蓝桥杯真题回文数字的讲解,引出关于三种回文判断的方式:数组或字符串直接反转数字


目录

前言:

蓝桥杯题目:回文数字

题目分析:

一、数组或字符串判断回文:

二、利用栈的数据结构判断回文:

三、直接反转数字


蓝桥杯题目:回文数字

观察数字:12321,123321  都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。
本题要求你找到一些5位或6位的十进制数字。满足如下要求:
该数字的各个数位之和等于输入的整数。


题目分析:

根据题目要求,我们了解到我们需要进行判断操作的数的范围是五位数到六位数,即10000到999999,也就是我们首先要生成这些数字,其次这些数字需要满足两个条件。

第一个条件:个数位之和等于我们输入的整数;

第二个条件:回文。

所以我们根据以上分析进行代码实现。

一、数组或字符串判断回文:

int main()
{
	int n = 0;
	scanf("%d", &n);
	int num = 0;
	//生成数字
	for (num = 10000; num <= 999999; num++)
	{
		int tmp = num;
		int sum = 0;
		int count = 0;
		//计算位数之和
		while(tmp)
		{
			sum += tmp % 10;
			tmp /= 10;
			//统计位数
			count++;
		}
		//判断回文
		int arr[6] = { 0 };
		tmp = num;
		int i = 0;
		for (i = 0; i < count; i++)
		{
			arr[i] = tmp % 10;
			tmp /= 10;
		}
		int flag = 1;
		for (i = 0; i < count / 2; i++)
		{
			if (arr[i] != arr[count - i - 1])
				flag = 0;
		}
		//判断是否同时满足两个条件,并输出
		if (sum == n && flag==1)
		{
			printf("%d\n", num);
		}
	}
	return 0;
}

二、利用栈的数据结构判断回文:

我们知道栈的特性是先入后出,即先进入的元素后出,那么判断回文恰恰可以利用栈这一特性,将前面一般的元素入栈后,再依次出栈与后面一半的元素相比较,如果相同,那么就说明这串字符为回文字符。

代码如下:

int main()
{
	int n = 0;
	scanf("%d", &n);
	int num = 0;
	//生成数字
	for (num = 10000; num <= 999999; num++)
	{
		int tmp = num;
		int sum = 0;
		int count = 0;

		//计算位数之和
		while (tmp)
		{
			sum += tmp % 10;
			tmp = tmp / 10;
			//统计位数
			count++;
		}
		int flag = 1;
		//判断回文
		SeqStack s;
		//将前一半字符入栈
		for (i = 0; i < count / 2; i++)
		{
			Push(s, str[i]);
		}
		if (count % 2) // 若输入字符为奇数个时自动跳过中间的字符
			i++;
		while (!EmptyStack(s))
		{
			Pop(s, e);
			if (e!= str[i])
			{
				flag = 0;
				break;
			}
			else
				i++;
		}
		//判断是否同时满足两个条件,并输出
		if (sum == n && flag == 1)
		{
			printf("%d\n", num);
		}
	}
	return 0;
}

三、直接反转数字:

直接反转数字的方法是一种很巧妙的方法,他的思想可以理解为取某个整数每一位的逆过程,我们知道想要的到某个整数的每一位只需要每次%10,再/10即可,那么直接反转数字的方法就是该过程的逆过程,代码实现也非常简单。

int main()
{
	int n;
	int flag = 0;
	scanf("%d", &n);
	int num = 0;
	for (num = 10000;  num <=999999;  num++)
	{
		//创建临时变量tmp,循环中利用tmp进行操作,不会影响num的值
		int tmp = num;
		int t = 0;
		int sum = 0;
		while (tmp)
		{
			//这里t计算得到的值就是该串字符反转后的值
			t = t * 10 + tmp % 10;
			sum += tmp % 10;
			tmp /= 10;
		}
		if (t == num && sum == n)
		{
			flag = 1;
			printf("%d\n", num);
		}
	}
	return 0;
}

这个代码最重要的思想就是   t = t * 10 + tmp % 10;

掌握后在进行回文判断上十分简单,并且这种方式的时间复杂度与空间复杂度相较前两种方式都有了显著提高。

猜你喜欢

转载自blog.csdn.net/2301_77112634/article/details/131142637