《算法导论》笔记(二)

2021-11-21  本文已影响0人  好之者不如乐之者

循环不变式

1.初始化
2.保持
3.终止
(与数学归纳法类似)

练习2.1

\color{red}{2.1-1}

Ans:

① j = 2,{31,41,59,26,41}
② j = 3,{31,41,59,26,41}
③ j = 4,{31,41,26,59,41},{31,26,41,59,41},{26,31,41,59,41}
④ j = 5,{26,31,41,41,59}

\color{red}{2.1-2}

Ans:
#include <bits/stdc++.h>

using namespace std;

int a[105];

int main()
{
        int n;
        cin >> n;
        for (int i = 1; i <= n; i++) {
                cin >> a[i];
        }
        for (int i = 2; i <= n; i++) {
                int key = a[i], j = i-1;
                while (j > 0 && a[j] >= key) {
                        a[j+1] = a[j];
                        j--;
                }
                a[j+1] = key;
        }
        for (int i = 1; i <= n; i++) {
                cout << a[i] << " ";
        }
        cout << endl;
        return 0;
}

\color{red}{2.1-3}

Ans:

① 初始化:i = 1时,若a[i] = v,则输出i
② 保持:若前k项中没有v,则无输出值,若第k+1项为v,则输出k+1
③ 终止:若将A数组中n项循环完,有则输出了i,没有则将v赋值为NIL

\color{red}{2.1-4}

Ans:

① 形式化描述:从两个n元数组最后一项开始相加,每次判断进位与否,将i从1循环到n即可
② 伪代码:

carry = 0
for i = 1 to n
        sum = a[i] + b[i]
        if sum == 2
                carry = 1
                c[i] = 0
        else
                carry = 0
                c[i] = sum
上一篇 下一篇

猜你喜欢

热点阅读