当前位置 博文首页 > 爱新觉罗?炒饭的博客:蓝桥杯历届试题-回文数字(学习到了如何得

    爱新觉罗?炒饭的博客:蓝桥杯历届试题-回文数字(学习到了如何得

    作者:[db:作者] 时间:2021-07-07 15:37

    简单写一下今天做的一道题
    在这里插入图片描述
    在这里插入图片描述

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

    方法一

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