兩個數推演算法
① 最簡單日柱推演算法 最簡單日柱推演算法是什麼
最簡單日柱推演算法:
一 、先求日柱參考數。
計算公式:
1 閏年,未過完2月:日柱參考數=10+XX*5+XX/4+大月數+30(如果是偶月)+日期-1-60N。平年,未過完2月:日柱參考數=10+XX*5+XX/4+大月數+30(如果是偶月)+日期-60N(平年不減1)。
2 無論平年還是閏年,如果已經過完2月,公式相同。日柱參考數=10+XX*5+XX/4+大月數+30(如果是偶月)+日期-2(過完2月)-60N。
注意:
1 XX=年份-1900;
2 XX/4後取整數;
3 大月數即是此月前的大月數(大月:正三五七八十臘,三十一天准不差);
4 60N:60的倍數。參考數減到差小於60或等於60為止。
二、以參考數求日柱的天乾地支。
1 以參考數個位數看天干:甲 1 乙 2 丙 3 丁 4 戊 5 己 6 庚 7 辛 8 壬 9 癸 0(即10)。
2 以參考數減12N(即12的倍數),減到差小於12或等於12為止,得出的數即是地支數,子1 丑 2 寅 3 卯 4 辰 5 巳 6午 7 未 8 申 9 酉 10 戌 11 亥 12。如果參考數小於或等於12,就從這個數求地支。
② 1加2等於25,2加3等於36,3加4等於47,4加5等於多少
4加5等於58。
1+2=25
2+3=36
3+4=47
每一項都是比前一項多11,也就是1+2=3=25,2+3=5=36,3+4=47,也就是說36比25多11,47比36多11,由此得出4+5=58。
順推法是從已知條件出發,逐步推算出要解決的問題的方法叫順推。
如斐波拉契數列,設它的函數為f(n),已知f(1)=1,f(2)=1;f(n)=f(n-2)+f(n-1)(n>=3,n∈N)。則我們通過順推可以知道,f(3)=f(1)+f(2)=2,f(4)=f(2)+f(3)=3……直至我們要求的解。
逆推法從已知問題的結果出發,用迭代表達式逐步推算出問題的開始的條件,即順推法的逆過程,稱為逆推。
(2)兩個數推演算法擴展閱讀
編程語言中,函數Func(Type a,……)直接或間接調用函數本身,則該函數稱為遞歸函數。遞歸函數不能定義為內聯函數。
在數學上,關於遞歸函數的定義如下:對於某一函數f(x),其定義域是集合A,那麼若對於A集合中的某一個值X0,其函數值f(x0)由f(f(x0))決定,那麼就稱f(x)為遞歸函數。
一個含直接或間接調用本函數語句的函數被稱之為遞歸函數,在上面的例子中能夠看出,它必須滿足以下兩個條件:
1) 在每一次調用自己時,必須是(在某種意義上)更接近於解;
2) 必須有一個終止處理或計算的准則。
③ 常見排序演算法歸納
排序演算法一般分類:
比較兩個相鄰的元素,將值大的元素交換至右端。
依次比較兩個相鄰的數,將小數放到前面,大數放到後面
即在第一趟:首先比較第1個數和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此一直繼續下去,直到比較最後兩個數,將小數放前,大數放後。然後重復第一趟步驟,直到所有排序完成。
第一趟比較完成後,最後一個數一定是數組中最大的一個數,所以第二趟比較的時候最後一個數不參與比較。
第二趟完成後,倒數第二個數也一定是數組中第二大的數,所以第三趟比較的時候最後兩個數不參與比較。
依次類推......
輸出結果:
冒泡排序的優點: 每進行一趟排序,就會少比較一次,因為每進行一趟排序都會找出一個較大值。如上例:第一趟比較之後,排在最後的一個數一定是最大的一個數,第二趟排序的時候,只需要比較除了最後一個數以外的其他的數,同樣也能找出一個最大的數排在參與第二趟比較的數後面,第三趟比較的時候,只需要比較除了最後兩個數以外的其他的數,以此類推……也就是說,沒進行一趟比較,每一趟少比較一次,一定程度上減少了演算法的量。
用時間復雜度來說:
從一個數組中隨機選出一個數N,通過一趟排序將數組分割成三個部分,1、小於N的區域 2、等於N的區域 3、大於N的區域,然後再按照此方法對小於區的和大於區分別遞歸進行,從而達到整個數據變成有序數組。
如下圖:
假設最開始的基準數據為數組的第一個元素23,則首先用一個臨時變數去存儲基準數據,即 tmp=23 ,然後分別從數組的兩端掃描數組,設兩個指示標志: low 指向起始位置, high 指向末尾。
首先從後半部分開始,如果 掃描到的值大於基準數據 就讓 high-1 ,如果發現有元素比該基準數據的值小,比如上面的 18 <= tmp ,就讓 high位置的值賦值給low位置 ,結果如下:
然後開始從前往後掃描,如果掃描到的值小於基準數據就讓 low+1 ,如果發現有元素大於基準數據的值,比如上圖 46 >= tmp ,就再將 low 位置的值賦值給 high 位置的值,指針移動並且數據交換後的結果如下:
然後再開始從前往後遍歷,直到 low=high 結束循環,此時low或者high的下標就是 基準數據23在該數組中的正確索引位置 ,如下圖所示:
這樣一遍遍的走下來,可以很清楚的知道,快排的本質就是把比基準數據小的都放到基準數的左邊,比基準數大的數都放到基準數的右邊,這樣就找到了該數據在數組中的正確位置。
然後採用遞歸的方式分別對前半部分和後半部分排序,最終結果就是自然有序的了。
輸出結果:
最好情況下快排每次能恰好均分序列,那麼時間復雜度就是O(nlogn),最壞情況下,快排每次劃分都只能將序列分為一個元素和其它元素兩部分,這時候的快排退化成冒泡排序,時間復雜度為O(n^2)。
插入排序的基本操作就是將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據,演算法適用於少量數據的排序,時間復雜度為O(n^2)。是穩定的排序方法。
將一個數據插入到 已經排好序的有序數據 中
第一趟排序:
用數組的第二個數與第一個數( 看成是已有序的數據 )比較
第二趟排序:
用數組的第三個數與已是有序的數據 {2,3} (剛才在第一趟排的)比較
在第二步中:
...
後面依此類推
輸出結果:
選擇排序是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到全部待排序的數據元素排完。 選擇排序是不穩定的排序方法。
舉例:數組 int[] arr={5,2,8,4,9,1}
第一趟排序 : 原始數據: 5 2 8 4 9 1
最小數據1,把1放在首位,也就是1和5互換位置,
排序結果: 1 2 8 4 9 5
第二趟排序 :
第1以外的數據 {2 8 4 9 5} 進行比較,2最小,
排序結果: 1 2 8 4 9 5
第三趟排序 :
除 1、2 以外的數據 {8 4 9 5} 進行比較,4最小,8和4交換
排序結果: 1 2 4 8 9 5
第四趟排序 :
除第 1、2、4 以外的其他數據 {8 9 5} 進行比較,5最小,8和5交換
排序結果: 1 2 4 5 9 8
第五趟排序:
除第 1、2、4、5 以外的其他數據 {9 8} 進行比較,8最小,8和9交換
排序結果: 1 2 4 5 8 9
輸出結果:
歸並排序(merge sort)是利用歸並的思想實現的排序方法,該演算法採用經典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題然後遞歸求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之)。
比如我們對 [8,4,5,7,1,3,6,2] 這個數組進行歸並排序,我們首先利用分治思想的「分」將數組拆分。
輸出結果: