蓝桥杯---黑洞数
任意一個(gè)5位數(shù),比如:34256,把它的各位數(shù)字打亂,重新排列,可以得到一個(gè)最大的數(shù):65432,一個(gè)最小的數(shù)23456。求這兩個(gè)數(shù)字的差,得:41976,把這個(gè)數(shù)字再次重復(fù)上述過程(如果不足5位,則前邊補(bǔ)0)。如此往復(fù),數(shù)字會落入某個(gè)循環(huán)圈(稱為數(shù)字黑洞)。
比如,剛才的數(shù)字會落入:[82962, 75933, 63954, 61974] 這個(gè)循環(huán)圈。
請編寫程序,找到5位數(shù)所有可能的循環(huán)圈,并輸出,每個(gè)循環(huán)圈占1行。其中5位數(shù)全都相同則循環(huán)圈為 [0],這個(gè)可以不考慮。
循環(huán)圈的輸出格式仿照:
[82962, 75933, 63954, 61974]
其中數(shù)字的先后順序可以不考慮。
題目意思很簡單,就是找出某個(gè)數(shù)重新排列之后(最大、最小)差,這樣找出一個(gè)循環(huán)節(jié),這里很好的運(yùn)用到了排序sort函數(shù)
從易到難。。。。。。首先想一個(gè)數(shù)怎么求循環(huán)節(jié),在把五位數(shù)的所有情況遍歷一下
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int main ( )
{
int n=10000,a[5]= {0},b[100][20]= {0},num[100]={0},sum= 0 ;//b[][]記錄所有輸出的序列,num為每個(gè)序列的長度,sum為所有滿足條件的序列的個(gè)數(shù)
//count為臨時(shí)數(shù)組的長度
while(n<=99999)//從10000到99999遍歷這些數(shù)的數(shù)字黑洞
{
if(n%11111==0){//其中5位數(shù)全都相同則循環(huán)圈為 [0],這個(gè)可以不考慮。
n++;
continue;
}
bool mark = 0;
int count=0,temp[20];
a[0]=n/10000,a[1]=n/1000%10,a[2]=n/100%10,a[3]=n/10%10,a[4]=n%10;
int temp1=0,temp2=0;
while(true)
{
sort(a,a+5);
temp1=a[0]*10000+a[1]*1000+a[2]*100+a[3]*10+a[4];
sort(a,a+5,cmp);
temp2=a[0]*10000+a[1]*1000+a[2]*100+a[3]*10+a[4];
temp1=temp2-temp1;
for(int i=0;i<sum;i++)//從已經(jīng)輸出的數(shù)字黑洞中查找是不是在黑洞中已經(jīng)有這個(gè)數(shù)了,如果有這個(gè)數(shù),那么肯定就重復(fù)了,即便是順序不一樣,由于題目
//說不考慮順序,所以這個(gè)數(shù)的數(shù)字黑洞就不用找了
for(int j=0;j<num[i];j++)
if(temp1==b[i][j]){
// cout<<'*'<<n<<endl;
mark=1;
}
if(mark) break;
for(int i=0; i<count; i++)//從當(dāng)前的臨時(shí)數(shù)列中查找是否出現(xiàn)重復(fù),如果重復(fù)了,說明這個(gè)已經(jīng)構(gòu)成了一個(gè)數(shù)字黑洞,輸出,并加入b[][]
if(temp1==temp[i])
{
// cout<<n<<':'<<sum<<" ";
int xx=0;
cout<<'[';
for(int j=i; j<count; j++){
cout<<temp[j];
b[sum][xx] = temp[j],xx++;
if(j<count-1) cout<<',';
}
cout<<']'<<endl;
mark=1;
num[sum]=xx;
sum++;
break;
}
if(mark) break;
temp[count]=temp1; //如果在已經(jīng)輸出的序列中沒有找到這個(gè)數(shù),并且這個(gè)數(shù)在臨時(shí)的數(shù)字黑洞中也沒有,就把他加入到臨沭的數(shù)字黑洞中
count ++;
for(int i=4; i>=0; i--) //對產(chǎn)生的新數(shù)加入到數(shù)組中,用于下一次的使用
{
a[i]=temp1%10;
temp1/=10;
}
}
n++;
}
return 0;
}
這道題不難,但是實(shí)現(xiàn)起來還是有些困難,從這道題目中學(xué)到了一點(diǎn),就是在做題的時(shí)候,尤其是對藍(lán)橋杯這樣的偏重“暴力”的比賽題目,如果一下遍歷思路不好想那就先想一種情況的判斷,這樣搞清楚一種情況的應(yīng)對方式,再改成循環(huán),這樣題目相對來說會顯得簡單不少,并且自己也會有信心做下去
總結(jié)
- 上一篇: 部队劳保鞋可以自己买鞋垫吗
- 下一篇: 武警特战预备队员淘汰后怎么办