蓝桥杯历届试题-回文数字(学习到了如何得到一个数字的每个位的数字情况)

简单写一下今天做的一道题
蓝桥杯历届试题-回文数字(学习到了如何得到一个数字的每个位的数字情况)_第1张图片
蓝桥杯历届试题-回文数字(学习到了如何得到一个数字的每个位的数字情况)_第2张图片

这道题是蓝桥杯历年题目,难度不算大,暴力法就可以做出来,下面主要给出两种方法。

方法一

#include
using namespace std;
int main()
{
     
	int a,b,c,d,e,f,n,num,count=0;
	cin>>n;
	for(int i=10000;i<=1000000;i++)
	{
     
		a=i%10;//个位
		b=(i%100)/10;//十位
		c=(i%1000)/100;//百位
		d=(i%10000)/1000;//千位
		e=(i%100000)/10000;//万位
		f=i/100000;//万位
		num=a+b+c+d+e+f;
		if(num==n)
		{
     
			if(f==0) 
		    {
     
			   if(a==e&&b==d)
			   {
     
			       cout<<i<<endl;
				   count++;
			   }
		    }
		    else 
		    {
     
			   if(a==f&&b==e&&c==d)
			   {
     
				  cout<<i<<endl;
				  count++;
			   }
		    }
		}
	}
	if(!count)
	   cout<<-1<<endl;
	return 0;
}

这个方法是我自己暴力法做出来的,思路很简单,题目说的是求5或6位数,直接遍历10000-999999所有的数,到当前数时,求出各个位的数字,然后检查各个位数字之和与输入的数字是否相同,再判断是不是回文数字。思路简单,代码也比较容易。但是后来我感觉这个方法虽然比较容易想到,但是考虑到如过题目让求的不止是5或6位,可能是3到10位的数字,那我这样通过一个个变量来记录每位数字就会很麻烦,而且代码也比较长,所以后面我觉得这个方法还不算很好。

方法二

#include
using namespace std;
int main()
{
     
	int n,flag=0,t,num,sum;//flag标志是否有符合条件的数 
	cin>>n;
	for(int i=10000;i<1000000;i++)
	{
     
		t=i,num=0,sum=0;
		while(t>0)
		{
     
			num=num*10+t%10;
			sum+=t%10;
			t/=10;
		}
		if(num==i&&sum==n)
		{
     
			flag=1;
			cout<<i<<endl; 
		} 
	}
	if(flag==0)
	  cout<<-1<<endl;
	return 0;
}

这个方法就比我自己想的那个先进一点。这个方法也是暴力法遍历10000-999999的所以数字,利用一个while循环来求当前数字逆序后得到的数字是不是和当前数字一样(即判断是否为回文数字),而且比较先进的在于利用循环来求各个位数字之和,比前面那个方法记录每个位的数字要先进很多。

通过这道题我觉得我学到了一个很好的方法来求一类问题,比如要输出一个数字的每个位的数字情况,就可以用下面这个代码:

#include
using namespace std;
int main()
{
     
	int a,t;
	cout<<"请输入一个数字\n";
	cin>>t;
	while(t>0)
	{
     
		a=t%10;
		t/=10;
		cout<<a<<" ";
	}
	return 0;
}

你可能感兴趣的:(蓝桥杯历届试题,算法)