任意乙個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 ...