#950. C++基础语法II

C++基础语法II

No testdata at current.

No submission language available for this problem.

语法阶段 I 的基本应用训练

一、最值问题

最值问题分很多种,基础阶段的最值问题常常指的是在一系列数中,找到最大,或找到最小。或再稍微难一些的找到第二最值,第三最值,第 K 最值

但都是以找到第一最值为为基础。

找最值的基本思想是:局部贪最值即每次探查一个新的数据时,都与已记录的最值进行比较,若新数据是新最值,则更新记录值。

如:记录的最大值是 7,准备探查 8,发现 8 > 7,则更新记录的最大值为 8。

题面问题通常会有两种方式

给出数据的范围

例如问题是:有 n 个整数 a1,a2,a3,...,ana_1, a_2, a_3, ..., a_n,每个整数 1ai100001≤a_i≤10000,输出其中的最大值。

可以设计一个记录最值的 maxx 并给初始值:(因为范围已知)

  • 找最大,设最小,最好比最小更小
  • 找最小,设最大,最好比最大更大
int n;
cin >> n;     // 准备输入 n 个整数
int maxx = 0; // 比最小更小
for (int i = 1; i <= n; i ++) {
    int a;
    cin >> a; // 循环输入每一个 a 值,准备进行探查
    if (a > maxx) {
        maxx = a; // 若探查的 a 比记录的最大值还大,则更新记录的最大值 maxx
    }
}
cout << "最大值为:" << maxx << endl;

不给出数据的范围

问题如上,但由于没给出数据范围,因此无法正确使用如上办法给出初始值。

可以考虑先输入第一个整数作为初始最值

int n;
cin >> n;    // 准备输入 n 个整数
int maxx;
cin >> maxx; // 输入第一个整数作为最值
for (int i = 2; i <= n; i ++) { // 已经输入了一个,还剩下 n - 1 个整数
    int a; 
    cin >> a;
    if (a > maxx) {
        maxx = a;
    }
}
cout << "最大值为:" << maxx << endl;

二、数位分离问题

该问题主要是来解决需要将一串整数进行拆分成每一位数码的问题。例如 123 拆成个位数 3,十位数 2,百位数 1

底层思想:带余数的整数除法 a ÷ b = c .... d

a/b = c 求商运算

a%b = d 求余运算

核心思想:十进制时,针对 b = 10 的整数拆分。

a/10 删除个位数

a%10 获得个位数

例如 a = 123a/10 = 12, a%10=3 两种计算分别后的删除个位数后的整数,和其个位数。

如图示: image

构建逻辑:当数字还不为 0 时,不断地进行拆分,直到拆成 0 为止。

/*设问:将输入的整数 n,从个位开始,拆出每一位进行输出,一个数码占一行*/
int n;
cin >> n;
while (n != 0) { // 当 n 还没被拆成 0 的时候,要一直拆
    int t = n % 10; // 用 t 存个位数
    n = n / 10;     // 删除个位数后重新存回 n

    cout << t << endl; // 输出
}

三、循环控制问题

循环控制是指使用 continuebreak 改变循环执行的过程或结束。

continue:结束本次循环 (结束循环体),继续下次循环

break:退出一层循环 (结束本循环)

建议使用实验性代码来辅助理解。

实验性代码

// 输出 1 ~ 10
for (int i = 1; i <= 10; i ++) {
    cout << i << ' ';
}
// 输出 1 ~ 5,在输出 5 之后,判断为真,执行了 break 退出循环
for (int i = 1; i <= 10; i ++) {
    cout << i << ' ';
    if (i == 5) break;
}
// 输出 1 ~ 4,在输出 5 之前,判断为真,执行了 break 退出循环
for (int i = 1; i <= 10; i ++) {
    if (i == 5) break;
    cout << i << ' ';
}
// 输出 1 ~ 4 和 6 ~ 10,在 i 为 5 的时候,判断为真,执行了 continue 结束本次循环,继续下次循环,即结束循环题,跳到 i++ 部分执行。
for (int i = 1; i <= 10; i ++) {
    if (i == 5) continue;
    cout << i << ' ';
}
// 找到第一个 x 的位置(位置:1~n)
int n;
cin >> n; // 共 n 个整数
int x;
cin >> x; // 准备找 x 
for (int i = 1; i <= n; i ++) {
    int t;
    cin >> t;
    if (t == x) {
         cout << x << " 在" << i << " 位置" << endl;
         break; 
        /* 已经找到了 x ,循环目的达成,可以停止
            但需要注意的是,若这样处理,后面没输入完的整数,将不会再输入。 */
    }
}