簡單寫一下今天做的一道題


這道題是藍橋杯歷年題目,難度不算大,暴力法就可以做出來,下面主要給出兩種方法,
方法一
#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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/258846.html
標籤:其他
上一篇:AI玩Flappy Bird│基于DQN的機器學習實體【完結】
下一篇:C語言貪吃蛇
