題目
本題將給定一個正整數,請將其看作四位數字(亦即四位數以下則前面補 0),並找出將數字重新排序後,能組成的最大整數。舉例來說,若給定數字為1324
,經過重新排列,能組成的最大數字為4321
;若原先給定的數字非四位數,如:25
,則需看成0025
這四位數字去做排列,重組後最大數字為5200
。
仔細看看6174
這個數字。乍看之下沒什麼特別之處,但是,自從 1949 年以來,它一直令數學家、數字控抓狂、癡迷。為什麼呢?因為人們發現,當我們任意選擇一個四位數字後 (唯一條件為不可四位皆相同),先將數字由大到小排序,得出大數,再由小到大排序,得出小數,並把所得出的大數減小數,不斷重複這幾個步驟,最終將會得到6174
這個神祕的數字。姑且不論為什麼,本題我們將要實作這個過程,題目將給定一個整數,請重複以上所述步驟,將每次計算出的答案印出來,兩兩以一個逗號開,直到印出6174
為止。
注意:本題給定的數字不會四位皆相同,例如:9999
。
輸入輸出格式
Sol
raisingArray
與由小到大排的陣列descendingArray
。bubble sort
,分別由大到小、由小到大排列。diff
。6174
,就重複上述步驟。Bubble Sort 泡沫演算法
我們以3142
為例:i = 0
:
從 j = 0 開始看,比較 num[0]、num[1],由於 3 > 1,因此兩數位置不動,
接下來看 num[1]、num[2],1 < 4,因此 1、4 位置互換,
接著再比 num[2]、num[3],1 < 2,兩數位置互換,由此一來,我們可以確定最後一項一定是四個數中最小的。i = 1
:
一樣從 j = 0 開始,比較 num[0]、num[1],由於 3 < 4,因此兩數位置互換,
此時我們可以看到這四個數都已經按照降冪排列排好了,不過電腦還是會繼續將這個迴圈跑完,我後面的部分就省略了,在這邊給大家一個連結,我覺得他 bubble sort 講的非常潛顯易懂。
Bubble sort:[C++] 氣泡排序法(Bubble sort)
Pseudocode:
// 先都將輸入的整數換成四位數
if initNum 是三位數
initNum *= 10
if initNum 是二位數
initNum *= 100
if initNum 是個位數
initNum *= 1000
int diff = initNum;
while (diff != 6174){
// 把diff中每一位數都存進raisingArray、descendingArray
raisingArray[0] = diff / 1000;
diff -= raisingArray[0] * 1000;
raisingArray[1] = diff / 100;
diff -= raisingArray[1] * 100;
raisingArray[2] = diff / 10;
diff -= raisingArray[2] * 10;
raisingArray[3] = diff;
for i in range 0 ~ 4
raisingArray[i] = descendingArray[i];
}
// 泡沫演算法,由小到大
for i in range 0 ~ 4
for j in range 0 ~ 4 - i - 1
if (raisingArray[j] > raisingArray[j + 1])
tmp = raisingArray[j];
raisingArray[j] = raisingArray[j + 1];
raisingArray[j + 1] = tmp;
raising = raisingArray[0] * 1000 + … + raisingArray[3]
// 泡沫演算法,由大到小
for i in range 0 ~ 4
for j in range 0 ~ 4 - i - 1
if (descendingArray[j + 1] > descendingArray[j])
tmp = descendingArray[j + 1];
descendingArray[j + 1] = descendingArray[j];
descendingArray[j] = tmp;
descending = descendingArray[0] * 1000 + … + descendingArray[3]
diff = descending – raising
if (diff != 6174)
cout << diff << ',';
else
cout << 6174;
}