iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0
Software Development

C++ 三十天學習紀錄系列 第 13

【Day 13】Array - Practice 1

  • 分享至 

  • xImage
  •  

題目
本題將給定一個正整數,請將其看作四位數字(亦即四位數以下則前面補 0),並找出將數字重新排序後,能組成的最大整數。舉例來說,若給定數字為1324,經過重新排列,能組成的最大數字為4321;若原先給定的數字非四位數,如:25,則需看成0025這四位數字去做排列,重組後最大數字為5200
仔細看看6174這個數字。乍看之下沒什麼特別之處,但是,自從 1949 年以來,它一直令數學家、數字控抓狂、癡迷。為什麼呢?因為人們發現,當我們任意選擇一個四位數字後 (唯一條件為不可四位皆相同),先將數字由大到小排序,得出大數,再由小到大排序,得出小數,並把所得出的大數減小數,不斷重複這幾個步驟,最終將會得到6174這個神祕的數字。姑且不論為什麼,本題我們將要實作這個過程,題目將給定一個整數,請重複以上所述步驟,將每次計算出的答案印出來,兩兩以一個逗號開,直到印出6174為止。

注意:本題給定的數字不會四位皆相同,例如:9999

輸入輸出格式

Sol

  1. 有可能碰到輸入的數字不滿四位數,此時我們需要將這個數補0至使其成為四位數。
  2. 運用陣列的觀念,看成有四個個位數字,分別存進之後要由大到小排列的陣列raisingArray與由小到大排的陣列descendingArray
  3. 運用泡沫演算法bubble sort,分別由大到小、由小到大排列。
  4. 將兩陣列的數字各自組合起來變兩個四位數做相減並輸出diff
  5. 只要輸出的數字不等於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;
}

上一篇
【Day 12】Array 陣列
下一篇
【Day 14】Function 函數
系列文
C++ 三十天學習紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言