任意乙個5位數,比如:34256,把它的各位數字打亂,重新排列,可以得到乙個最大的數:65432,乙個最小的數23456。求這兩個數字的差,得:41976,把這個數字再次重複上述過程(如果不足5位,則前邊補0)。如此往復,數字會落入某個迴圈圈(稱為數字黑洞)。
比如,剛才的數字會落入:[82962, 75933, 63954, 61974] 這個迴圈圈。要求編寫程式,找到5位數所有可能的迴圈圈,並輸出。
這是某個比賽中的乙個問題,我試著用c語言求了一下。大概思路就是:把五位數拆分,排序,求最大和最小數,求差,再判斷是否落入了黑洞數的迴圈。
/*這段程式很多不足之處,比如在對最大和最小數求差的時候,只求了100次,當然算出來結果也是對的,因為五位數的黑洞數都能在100次之內被檢測出來,其實實際情況遠遠用不了100次。結果雖然對,但思路總歸不嚴謹。下面給出乙個用遞迴法求解的。***************************************
輸出5位數的全部黑洞數
****************************************
*/#include
int max_min(int
num);
void find(int
num);
int c[20]=,k=0; //
這兩個全域性變數是為了查重
void
main()
} /*
*********************************
函式名稱:max_min
函式功能:把乙個五位數的各位提取出來,
重新組合成最大數和最小數,並求差
引數:num--輸入的五位數
返回值:sub_result--最大數與最小數的差
**********************************
*/int max_min(int
num)
for(i=0;i<=3;i++) //
從大到小排序
for(j=0;j<=3-i;j++)
}for(i=0;i<=4;i++)
for(i=4;i>=0;i--)
sub_result=max-min; //
求差 return
sub_result; }/*
********************************
函式名稱:find
函式功能:判斷輸入的數是否有黑洞數,並輸出
引數:num--輸入的五位數
*********************************
*/void find(int
num)
}break
; }
}if(flag==1) //
存在黑洞數並且前面沒有輸出過
printf("%d
",b[j]);
c[k++]=b[j];
printf("%c
",']');
printf("\n
");return
; }}}
#includeint max_min(int這段**用了遞迴呼叫,可以一直求最大值與最小值的差直到出現迴圈。這種思路就比前面的那種要好很多。輸出結果如下:num);
void find(int
num);
int record1[50]=,k=0; //
這兩個全域性變數是為了查重
int record2[100],f; //
每次使用前清零
void
main()
f=0; }
} /*
*********************************
函式名稱:max_min
函式功能:把乙個五位數的各位提取出來,
重新組合成最大數和最小數,並求差
引數:num--輸入的五位數
返回值:sub_result--最大數與最小數的差
**********************************
*/int max_min(int
num)
for(i=0;i<=3;i++) //
從大到小排序,冒泡法排序
for(j=0;j<=3-i;j++)
}for(i=0;i<=4;i++)
for(i=4;i>=0;i--)
sub_result=max-min; //
求差 return
sub_result; }/*
********************************
函式名稱:find
函式功能:判斷輸入的數是否有黑洞數,並輸出
引數:num--輸入的五位數
*********************************
*/void find(int
num)
} printf("%c
",'[');
for(j=i;j1;j++) //
將黑洞數輸出
printf("%d
",record2[j]);
record1[k++]=record2[j]; //
記錄,為下次輸出查重
printf("
%c",']'
); printf("\n
");return; //
輸出完畢,退出
} }
record2[f++]=n;
find(n);
//遞迴呼叫
}
當然這段**還有些問題,雖然可以輸出正確結果,但是效率不高,從10000檢測到99999要把所有的5位數都檢測一遍,很複雜。不過現在我還沒想到更高效率的解法,以後努力吧。
python求黑洞數 求解黑洞數
問題描寫 黑洞數又稱圈套數,是類具有奇特轉換特性的整數。任何1個數字不全相同的整數,經有限 重排求差 操作,總會得到某1個或1些數,這些數即為黑洞數。重排求差 操作即把組成該數的數字重排後得到的最大數減去重排後得到的最小數。舉個例子,3位數的黑洞數為495.簡易推導程序 隨意找個數,如297,3個位...
1019 數字黑洞
給定任乙個各位數字不完全相同的4位正整數,如果我們先把4個數字按非遞增排序,再按非遞減排序,然後用第1個數字減第2個數字,將得到乙個新的數字。一直重複這樣做,我們很快會停在有 數字黑洞 之稱的6174,這個神奇的數字也叫kaprekar常數。例如,我們從6767開始,將得到 7766 6677 10...
PAT 數字黑洞
數字黑洞 20 時間限制 1000 ms 記憶體限制 32768 kb 長度限制 100 kb 判斷程式 standard 來自 小小 題目描述 給定任乙個各位數字不完全相同的4位正整數,如果我們先把4個數字按非遞增排序,再按非遞減排序,然後用第1個數字減第2個數字,將得到 乙個新的數字。一直重複這...