基礎演算法 一

2022-01-28 16:31:02 字數 4583 閱讀 2664

首先必須得說本人對演算法研究不深,一些簡單的就得想半天,老是這樣感覺不太好,遂記錄下一些常見的基礎演算法,避免尷尬。不足之處請各位多多指教。

其次,用vs寫c語言程式時可能會出現如下錯誤:

錯誤 c4996 'scanf': this function or variable may be unsafe. consider using scanf_s instead. to disable deprecation, use _crt_secure_no_warnings. see online help for details.

解決方法1:在**的開頭加上這句  #pragma warning(disable:4996)

解決方法2:在建立專案時按下圖進行選中:

最後,進入正題。。。

1.最大公約數

01.短除法:我們小學學習的用來求最大公約數的方法,體現在**中主要的操作就是比較和累乘。

#includeint

main()

}printf(

"maximal common divisor is %d\n

", t);

return0;

}

02.輾轉相除法:它根據遞推策略設計的,求解效率更高。   

#includeint

main()

else

}printf(

"maximal common divisor is %d\n

", b);

return0;

}

03相減法:兩數中的大數減小數,其差與減數再進行大數減小數,直到差與減數相等為止,此時的差或者減數就是最大公約數。

#includeint

main()

else

c = a -b;

}printf(

"maximal common divisor is %d\n

", b);

return0;

}

2.最小公倍數在我們已經求出最大公約數的情況下,再求最小公倍數就很容易了。下面給出的是短除法求得最大公約數之後求最小公倍數的方法:

#includeint

main()

}printf(

"minimal common multiple is %d\n

", t*a*b);

return0;

}

3.素數這個好像有點尷尬,演算法課上,老師點了兩個同學到黑板上去寫,然後兩個都寫得不太對。。。後來想想,作為大三,真的。。。可能是一時被點還有點沒反應過來吧。

#include#include

intmain()

if (i == 0

) printf(

"%d is a prime number.\n

", x);

}return0;

}

4.完數乙個數如果恰好等於它的因子之和,這個數就稱為」完數「,6的因子為1,2,3,而6=1+2+3,所以6就是完數。

#includeint

main()

}return0;

}

5.裴波那挈數列裴波那挈數列具有以下特點:

a1,a2已知

a(n)=a(n-1)+a(n-2)  n>=3

我們在很多地方都會遇到這個數列,比如兔子繁殖問題、樹枝問題、上樓方式問題、蜂房問題等等。我們既可以用遞推,也可以用遞迴的方法來解決。

//

遞推#includeint

main()

return0;

}

//

遞迴#includeint f(int

n)int

main()

6.楊輝三角1

1   1

1   2   1

1   3   3   1

1   4   6   4   1

楊輝三角是(a+b)^n (n>=0)展開後各項的係數,具有以下規律:

1.各行的第乙個數和最後乙個數都是1

2.從第3行起,除第乙個數和最後乙個數外,其餘各數是上一行同列和前一列兩個數之和。即a[i][j]=a[i-1][j]+a[i-1][j-1]  (i表示行數,j表示列數)

#includeconst

int n = 10

;int

main()

for (i = 0; i < n; i++)

return0;

}

7.魔方陣魔方陣,它的每一行,每一列以及對角線上的各數之和為乙個相同的常數。

這裡只考慮了奇次階魔方陣,陣列下標是從1~n。

#includeint

main()

for (i = 1; i <= n; i++)

for (j = 1; j <= n; j++)

a[i][j] = 0

; i = 1

; j = (int)(n+1)/ 2

; x = 1

;

while (x <= n*n)

}for (i = 1; i <= n; i++)

}

8.漢諾塔問題簡單的說就是有a,b,c三個基座,要將a座上的盤子移動到b座,在移動的過程中3個基座上的盤子都必須保持**在下,小盤在上,可以利用c座做輔助。

記得大一的時候,怎麼都不太懂,那個時候好像題目都沒太讀懂,然後不理解遞迴,就一直害怕這個。

我們把n個盤子抽象地看作是「兩個盤子」,上面乙個由1~n-1號組成,下面乙個就是第n號盤子,移動過程如下:

1.先把上面乙個盤子以a基座為起點借助b基座移動到c基座,

2.把下面乙個盤子從a基座移動到b基座,

3.再把c基座上的乙個盤子借助a基座移動到b基座。

#includevoid hanoi(int n, char a,char b,char

c);int

main()

void hanoi(int n, char a, char b, char

c)}

9.整數的劃分問題對於乙個正整數的劃分,就是把n表示成一系列正整數之和的表示式。例如n=6的劃分如下:

5+1   

4+2   4+1+1

3+3   3+2+1   3+1+1+1

2+2+2    2+2+1+1    2+1+1+1+1

1+1+1+1+1+1

問題:對於給定的正整數n,求出它劃分的數目

根據n=6的例項發現:第一行及以後的資料都不超過6,第二行及以後的資料都不超過5,......第六行的資料都不超過1.據此,定義乙個函式q(n,m),表示整數n的「任何加數都不超過m"的分劃得數目,n的所有劃分的數目就是q(n,n)

一般q(n,m)有以下遞迴關係:

q(n,n)=1+q(n,n-1)        

q(n,n)=q(n,m-1)+q(n-m,m)   (n>m)

遞迴的停止條件:

q(n,1)=1

q(1,m)=1

#includeint divinteger(int n, int

m);int

main()

printf(

"%d\n

", divinteger(n, n));

}int divinteger(int n, int

m)

10.開燈問題有從1到n依次編號的n個同學和n盞燈。1號同學將所有的燈都關掉,2號同學將編號為2的倍數的燈都開啟,3號同學將編號為3的倍數的燈都關掉,.......以後的同學都將自己編號的倍數的燈做相反的處理。(該號燈如是開啟的,則關掉;如關閉的,則開啟)。問經n個同學操作後,哪些燈是開啟的

1.定義n個元素的a陣列,它的每個下標變數a[i]視為一燈,i表示其編號。a[i]=1表示第i盞燈處於開啟狀態,a[i]=0表示第i盞燈處於關閉狀態。

2.通過算術運算a[i]=1-a[i](桌球開關),模擬「開關」燈的操作。

#includeint

main()

for (i = 2; i <=n; i++)

for (i = 1; i <=n; i++)

printf("\n

");}

}

好了,就到這裡,下次見!

演算法基礎(一) 基礎

學習了那麼久,一直沒有好好寫寫演算法。下面我簡單描述一下演算法方面知識。在已證明演算法正確性的前提下,評價演算法的好壞主要是關注演算法在時間和 空間上效能的優劣。演算法時間效能 的分析是通過計算 演算法時間複雜度 實現的,其關鍵就是計算演算法的執行時間。乙個演算法的執行時間,就是演算法中每條語句的執...

演算法基礎 一

一些有用的演算法 數值演算法,比如隨機化 分解因式 處理質數 數值積分 熟練操作常見的資料結構的方法,比如堆 樹 平衡樹 b數 排序和搜尋 網路演算法,比如最短路徑 生成樹 拓撲排列和流計算 一些常規的問題解決技巧 暴力或者窮舉搜尋 分治法回溯法 遞迴分支界限 貪心演算法和爬山法 最小花費演算法 縮...

演算法基礎(一)

博主這幾天面試總會被問到演算法相關知識,關鍵博主面試的是西安測試崗位,現在測試門檻都這麼高了嗎。各種手撕演算法 那就先從最基本開始看吧 一 時間複雜度計算 時間複雜度 定性描述該演算法的執行時間 這種只執行一次的,時間複雜度為o 1 這種執行n次的,時間複雜度為o n 當然如果前面是執行一次的,後面...