日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

蓝桥杯---黑洞数

發(fā)布時(shí)間:2024/8/26 综合教程 33 生活家
生活随笔 收集整理的這篇文章主要介紹了 蓝桥杯---黑洞数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

任意一個(gè)5位數(shù),比如:34256,把它的各位數(shù)字打亂,重新排列,可以得到一個(gè)最大的數(shù):65432,一個(gè)最小的數(shù)23456。求這兩個(gè)數(shù)字的差,得:41976,把這個(gè)數(shù)字再次重復(fù)上述過程(如果不足5位,則前邊補(bǔ)0)。如此往復(fù),數(shù)字會(huì)落入某個(gè)循環(huán)圈(稱為數(shù)字黑洞)。
比如,剛才的數(shù)字會(huì)落入:[82962, 75933, 63954, 61974] 這個(gè)循環(huán)圈。

請(qǐng)編寫程序,找到5位數(shù)所有可能的循環(huán)圈,并輸出,每個(gè)循環(huán)圈占1行。其中5位數(shù)全都相同則循環(huán)圈為 [0],這個(gè)可以不考慮。

循環(huán)圈的輸出格式仿照:
[82962, 75933, 63954, 61974]

其中數(shù)字的先后順序可以不考慮。

題目意思很簡(jiǎn)單,就是找出某個(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è)序列的長(zhǎng)度,sum為所有滿足條件的序列的個(gè)數(shù)
	                                                           //count為臨時(shí)數(shù)組的長(zhǎng)度                     
    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--)  //對(duì)產(chǎn)生的新數(shù)加入到數(shù)組中,用于下一次的使用 
            {
                a[i]=temp1%10;
                temp1/=10;
            }
        }
        n++;
    }
    return 0;
}

這道題不難,但是實(shí)現(xiàn)起來還是有些困難,從這道題目中學(xué)到了一點(diǎn),就是在做題的時(shí)候,尤其是對(duì)藍(lán)橋杯這樣的偏重“暴力”的比賽題目,如果一下遍歷思路不好想那就先想一種情況的判斷,這樣搞清楚一種情況的應(yīng)對(duì)方式,再改成循環(huán),這樣題目相對(duì)來說會(huì)顯得簡(jiǎn)單不少,并且自己也會(huì)有信心做下去

總結(jié)

以上是生活随笔為你收集整理的蓝桥杯---黑洞数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。