第2章 簡單的演算法舉例

2021-10-08 06:12:02 字數 2637 閱讀 7947

【例 2.1】求 1 × 2 × 3 × 4 × 5 。

可以用最原始的方法進行:

步驟 1: 先求 1 乘以 2,得到結果 2 。

步驟 2: 將步驟 1 得到的乘積 2 再乘以 3,得到結果 6 。

步驟 3: 將 6 再乘以 4,得 24 。

步驟 4: 將 24 再乘以 5,得 120 。這就是最後的結果

這樣的演算法雖然是正確的,但太繁瑣。

我們不妨改進一下:

s1: 令 p = 1,或寫成 1 => p (表示將 1 存放在變數 p 中)

s2: 令 i = 2,或寫成 2 => i (表示將 2 存放在變數 i 中)

s3: 使 p 與 i 相乘,乘積仍放在變數 p 中,可表示為: p * i => p

s4: 使 i 的值加 1,即 i + 1 => i

s5: 如果 i 不大於 5,返回重新執行 s3 及其後的步驟 s4 和 s5;否則,演算法結束。最後得到 p 的值就是 5! 的值。

顯然,這個演算法比前面列出的演算法簡練。

如果題目改為:求 1 × 2 × 3 × 4 × 5 。演算法只須做很少的改動:

s1: 1 => p

s2: 3 => i

s3: p * i => p

s4: i + 2 => i

s5: 若 i ≤ 11,返回 s3;否則,結束。

可以看出用這種方法表示的演算法具有一般性、通用性和靈活性。

【例 2.2】有 50 個學生,要求輸出成績在 80 分以上的學生的學號和成績。

為了描述方便,不妨設:

n:表示學生學號

g:表示學生的成績

i :表示第幾個學生

演算法步驟:

s1: 1 => i

s2: 如果 gi ≥ 80,則輸出 ni 和 gi,否則不輸出

s3: i + 1 => i

s4: 如果 i ≤ 50,返回到 s2,繼續執行,否則,演算法結束

【例 2.3】判定2000—2023年中的每一年是否為閏年,並將結果輸出。

先分析閏年的條件:

能被 4 整除,但不能被 100 整除的年份都是閏年。

能被 400 整除的年份是閏年。

設 year 為被檢測的年份。演算法可表示如下:

s1: 2000 => year

s2: 若 year 不能被 4 整除,則輸出 year 的值和 「不是閏年」。然後轉到 s6,檢查下乙個年份

s3: 若 year 能被 4 整除,不能被 100 整除,則輸出 yea r的值和 「是閏年」。然後轉到 s6

s4: 若 year 能被 400 整除,輸出 year 的值和 「是閏年」 ,然後轉到 s6

s5: 輸出 year 的值和 「不是閏年」

s6: year + 1 => year

s7: 當 year ≤ 2500 時,轉 s2 繼續執行,否則演算法停止

【例 2.4】求 1 - 1/2 + 1/3 - 1/4 + … + 1/99 - 1/100 。

解題思路:表面看,每一項都不一樣,但稍加分析,就可以看到:

第 1 項的分子分母都是 1,即 1/1;

第 2 項的分母是 2,以後每一項的分母都是前一項的分母加 1;

第 2 項前的運算子為 " - ",後一項前面的運算子都與前一項前的運算子相反。

這就找到了多項式的規律,能把多項式表示為一般形式,即把問題抽象化了。

sign:表示當前項的數值符號

term:表示當前項的值

sum:表示當前項的累加和

deno:表示當前項的分母

演算法步驟:

s1: sign = 1

s2: sum = 1

s3: deno = 2

s4: sign = (-1) * sign

s5: term = sign * (1/deno)

s6: sum = sum + term

s7: deno = deno + 1

s8: 若 deno ≤ 100 返回 s4;否則演算法結束

【例 2.5】給出乙個大於或等於 3 的正整數,判斷它是不是乙個素數。

解題思路:所謂素數,是指除了 1 和該數本身之外,不能被其他任何整數整除的數。例如, 13 是素數,因為它不能被 2,3,4,… ,12 整除。

演算法步驟:

s1: 輸入 n 的值

s2: i = 2(i作為除數)

s3: n 被 i 除,得餘數 r

s4: 如果 r = 0,表示 n 能被i整除,則輸出 n 「不是素數」,演算法結束;否則執行 s5

s5: i + 1 => i

s6: 如果 i ≤ n - 1,返回 s3;否則輸出 n 的值以及「是素數」,然後結束

第 2 章 演算法

演算法 是解決待定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示乙個或多個操作。指演算法在執行有限的步驟後,自動結束而不會出現無限迴圈,並且每乙個步驟在可接受的時間內完成。演算法的每一步驟都具有確定的含義,不會出現二義性。演算法的每一步都必須是可行的,也就是說,每一步都能夠通過...

第2章 演算法分析

知識點 2.1 數學基礎 法則1 如果t1 n o f n 且t2 n o g n 那麼 a t1 n t2 n o f n g n 或者t1 n t2 n o max f n g n b t1 n t2 n o f n g n 法則2 如果t n 是乙個k次多項式,則t n n k 法則3 對於任...

第2章 演算法分析

最大子串行和問題的求解 演算法1 時間複雜度為o n 3 1 public static int maxsubsum1 int a 21617 return maxsum 18 演算法2 時間複雜度為o n 2 1 public static int maxsubsum2 int a 216 171...