藍橋杯 黑洞數 解題報告

2021-06-28 19:14:21 字數 1363 閱讀 3953

任意乙個5位數,比如:34256,把它的各位數字打亂,重新排列,可以得到乙個最大的數:65432,乙個最小的數23456。求這兩個數字的差,得:41976,把這個數字再次重複上述過程(如果不足5位,則前邊補0)。如此往復,數字會落入某個迴圈圈(稱為數字黑洞)。

比如,剛才的數字會落入:[82962, 75933, 63954, 61974] 這個迴圈圈。

請編寫程式,找到5位數所有可能的迴圈圈,並輸出,每個迴圈圈占1行。其中5位數全都相同則迴圈圈為 [0],這個可以不考慮。

迴圈圈的輸出格式仿照:

[82962, 75933, 63954, 61974]

其中數字的先後順序可以不考慮。

本以為會是比較容易能做出來的,但是由於沒有考慮所有的情況,加上過年這幾天吃昏頭了,做了3個多小時

對於黑洞數的定義,題目很清晰,要獲得數列中的下乙個數,就必須對給定的數的每一位重新排序求得最大和最小,而且還有可能出現位數不足五位的情況,所以,在拆數的時候,我固定就拆5次,這樣,不足的位數就可以被0補上,從而滿足題目的要求。,查詢迴圈圈也比較容易,麻煩就麻煩在重複的迴圈圈如何判別,這裡我是用這樣的方法:對於每乙個數,都有乙個判別標誌位visited,每一次讀入乙個數,就把這個標誌置1,這樣,當我們得到乙個含有迴圈圈的數列之後,每乙個數在大迴圈中都不可能出現,但還存在一種情況,就是通過乙個從未被訪問的數,卻進入之前進入過的乙個迴圈圈,解決的方法是:在讀數的時候把每含有迴圈圈的數列的每乙個數的標誌位再加1,也就是2,這樣既不會影響上面迴圈中重複位的判斷,也可以避免通過不同的數進入同乙個迴圈圈,因為當檢測到某乙個數的標誌位為2時,不僅停止迴圈,而且通過flag標誌阻止下面進行輸出,這樣就可以順利求出所有的迴圈圈,也就是黑洞數。

#include#include#include#include#define n 90000

using namespace std;

int num[n];

int visited[100000];

int s[n];

bool cmp(int a,int b)

void init()

sort(temp,temp+5);

for(i=0;i<5;i++)

return t;

}int getmin(int n)

sort(temp,temp+5,cmp);

for(i=0;i<5;i++)

return t;

}int main()

if(find(t,j)==1)

else

break;

t=getmax(t)-getmin(t);

} if(flag==0&&t!=0)

{ for(k=0;k

藍橋杯 花朵數 解題報告

乙個n位的十進位制正整數,如果它的每個位上的數字的n次方的和等於這個數本身,則稱其為花朵數。例如 當n 3時,153就滿足條件,因為 1 3 5 3 3 3 153,這樣的數字也被稱為水仙花數 其中,表示乘方,5 3表示5的3次方,也就是立方 當n 4時,1634滿足條件,因為 1 4 6 4 3 ...

藍橋杯 5位黑洞數

任意乙個5位數,比如 34256,把它的各位數字打亂,重新排列,可以得到乙個最大的數 65432,乙個最小的數23456。求這兩個數字的差,得 41976,把這個數字再次重複上述過程 如果不足5位,則前邊補0 如此往復,數字會落入某個迴圈圈 稱為數字黑洞 比如,剛才的數字會落入 82962,7593...

藍橋杯 砝碼稱重 遞迴 解題報告

5個砝碼 用天平稱重時,我們希望用盡可能少的砝碼組合稱出盡可能多的重量。如果只有5個砝碼,重量分別是1,3,9,27,81。則它們可以組合稱出1到121之間任意整數重量 砝碼允許放在左右兩個盤中 本題目要求程式設計實現 對使用者給定的重量,給出砝碼組合方案。例如 使用者輸入 5程式輸出 9 3 1 ...