当前位置 博文首页 > 爱新觉罗?炒饭的博客:蓝桥杯历届试题-回文数字(学习到了如何得
简单写一下今天做的一道题
这道题是蓝桥杯历年题目,难度不算大,暴力法就可以做出来,下面主要给出两种方法。
#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