6.2
一、什麽是水仙花數
水仙花數只是自冪數的一種,嚴格來說3位數的3次冪數才稱為水仙花數。
附:其他位數的自冪數名字
一位自冪數:獨身數
兩位自冪數:沒有
三位自冪數:水仙花數
四位自冪數:四葉玫瑰數
五位自冪數:五角星數
六位自冪數:六合數
七位自冪數:北鬥七星數
八位自冪數:八仙數
九位自冪數:九九重陽數
十位自冪數:十全十美數
常見水仙花數
水仙花數又稱阿姆斯特朗數。
三位的水仙花數共有4個:153,370,371,407;
四位的四葉玫瑰數共有3個:1634,8208,9474;
五位的五角星數共有3個:54748,92727,93084;
六位的六合數只有1個:548834;
七位的北鬥七星數共有4個:1741725,4210818,9800817,9926315;
八位的八仙花數共有3個:24678050,24678051,88593477
……
使用高精度計算,可以得到超過int類型上限的水仙花數:
5: 93084
5: 92727
5: 54748
6: 548834
7: 9800817
7: 4210818
7: 1741725
7: 9926315
8: 24678050
8: 24678051
8: 88593477
9: 146511208
9: 912985153
9: 472335975
9: 534494836
10: 4679307774
11: 32164049650
11:40028394225
11: 42678290603
11: 49388550606
11: 32164049651
11: 94204591914
11: 44708635679
11: 82693916578
14: 28116440335967
16: 4338281769391370
16: 4338281769391371
17: 21897142587612075
17: 35641594208964132
17: 35875699062250035
19: 1517841543307505039
19: 3289582984443187032
19: 4929273885928088826
19: 4498128791164624869
20: 63105425988599693916
21: 449177399146038697307
21: 128468643043731391252
23: 27907865009977052567814
23: 35452590104031691935943
23: 27879694893054074471405
23: 21887696841122916288858
24: 174088005938065293023722
24: 188451485447897896036875
(為環保起見,24位以上的水仙花數略)
最大的水仙花數有39位。十進制自然數中的所有水仙花數共有88個。
用法
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script type="text/javascript">
var a = 0, b = 0, c = 0;
for (var i = 100; i < 1000; i++)
{
a = i % 10;
b = parseInt(((i / 10) % 10));
c = parseInt(i / 100);
if (i === a * a * a + b * b * b + c * c * c)
{
document.write(‘水仙花數: ‘ + i + ‘<br/>‘);
}
}
</script>
</body>
</html>
二、排序
排序(Sorting) 是計算機程序設計中的一種重要操作,它的功能是將一個數據元素(或記錄)的任意序列,重新排列成一個關鍵字有序的序列。
分類
穩定的
冒泡排序(bubble sort) — O(n^2)
雞尾酒排序(Cocktail sort,雙向的冒泡排序) — O(n^2)
插入排序(insertion sort)— O(n^2)
桶排序(bucket sort)— O(n); 需要 O(k) 額外空間
計數排序(counting sort) — O(n+k); 需要 O(n+k) 額外空間
合並排序(merge sort)— O(nlog n); 需要 O(n) 額外空間
原地合並排序— O(n^2)
二叉排序樹排序 (Binary tree sort) — O(nlog n)期望時間; O(n^2)最壞時間; 需要 O(n) 額外空間
鴿巢排序(Pigeonhole sort) — O(n+k); 需要 O(k) 額外空間
基數排序(radix sort)— O(n·k); 需要 O(n) 額外空間
Gnome 排序— O(n^2)
圖書館排序— O(nlog n) with high probability,需要 (1+ε)n額外空間
不穩定的
選擇排序(selection sort)— O(n^2)
希爾排序(shell sort)— O(nlog n) 如果使用最佳的現在版本
組合排序— O(nlog n)
堆排序(heapsort)— O(nlog n)
平滑排序— O(nlog n)
快速排序(quicksort)— O(nlog n) 期望時間,O(n^2) 最壞情況; 對於大的、亂數列表一般相信是最快的已知排序
Introsort— O(nlog n)
Patience sorting— O(nlog n+ k) 最壞情況時間,需要 額外的 O(n+ k) 空間,也需要找到最長的遞增子串行(longest increasing subsequence)
不實用的
Bogo排序— O(n× n!) 期望時間,無窮的最壞情況。
Stupid sort— O(n^3); 遞歸版本需要 O(n^2) 額外存儲器
珠排序(Bead sort) — O(n) or O(√n),但需要特別的硬件
Pancake sorting— O(n),但需要特別的硬件
stooge sort——O(n^2.7)很漂亮但是很耗時
三、冒泡排序
冒泡排序(Bubble Sort),是一種計算機科學領域的較簡單的排序算法。
它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。
原理:
冒泡排序算法的運作如下:(從後往前)
比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
針對所有的元素重復以上的步驟,除了最後一個。
持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
JavaScript
function bubbleSort(arr) {
var i = arr.length, j;
var tempExchangVal;
while (i > 0) {
for (j = 0; j < i - 1; j++) {
if (arr[j] > arr[j + 1]) {
tempExchangVal = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tempExchangVal;
}
}
i--;
}
return arr;
}
var arr = [3, 2, 4, 9, 1, 5, 7, 6, 8];
var arrSorted = bubbleSort(arr);
console.log(arrSorted);
alert(arrSorted);
四、選擇排序
選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完。 選擇排序是不穩定的排序方法(比如序列[5, 5, 3]第一次就將第一個[5]與[3]交換,導致第一個5挪動到第二個5後面)。
選擇排序法的第一層循環從起始元素開始選到倒數第二個元素,主要是在每次進入的第二層循環之前,將外層循環的下標賦值給臨時變量,接下來的第二層循環中,如果發現有比這個最小位置處的元素更小的元素,則將那個更小的元素的下標賦給臨時變量,最後,在二層循環退出後,如果臨時變量改變,則說明,有比當前外層循環位置更小的元素,需要將這兩個元素交換.
選擇排序是這樣實現的:
1、設數組內存放了n個待排數字,數組下標從1開始,到n結束。
2、初始化i=1
3、從數組的第i個元素開始到第n個元素,尋找最小的元素。
4、將上一步找到的最小元素和第i位元素交換。
5、i++,直到i=n-1算法結束,否則回到第3步
選擇排序的平均時間復雜度也是O(n^2)的。
舉例:
564
比如說這個,我想讓它從小到大排序,怎麽做呢?
第一步:從第一位開始找最小的元素,564中4最小,與第一位交換。結果為465
第二步:從第二位開始找最小的元素,465中5最小,與第二位交換。結果為456
第三步:i=2,n=3,此時i=n-1,算法結束
完成
6.2