GESP2024年3月认证C++二级( 第三部分编程题(1) 乘法问题)


🌟《乘法问题》


一、🎬 小A的乘法挑战

1、小A刚学会乘法,特别开心 😄

老师给了他很多正整数,让他把这些数全部乘起来。


(1)比如:

cpp 复制代码
3
5

(2)小A会算:

cpp 复制代码
3 × 5 = 15

(3)输出结果是15


2、⚠ 但是有一个规定:

(1)如果乘积 超过 1000000(100万)

小A就会晕掉 🤯,不会算了。


(2)这时候我们要输出:

cpp 复制代码
>1000000

二、🌟 题目真正要我们做什么?

1️⃣ 读入 n(有多少个数)

cpp 复制代码
int n;
cin >> n;

2️⃣ 读入 n 个整数

cpp 复制代码
for (int i = 0; i < n; ++i) {
    int a;
    cin >> a;

3️⃣ 把它们全部乘起来

cpp 复制代码
long long product = 1;
for (int i = 0; i < n; ++i) {
    int a;
    cin >> a;
    product *= a;
}

4️⃣ 如果乘积 > 1000000

输出:>1000000

否则

输出乘积

cpp 复制代码
long long product = 1;
for (int i = 0; i < n; ++i) {
    int a;
    cin >> a;
    if (product * a > 1000000) {
        cout << ">1000000" << endl;
    return 0;
    }
    product *= a;
}

三、🧠 实例说明

1、假设输入:

cpp 复制代码
3
100
100
100

你算算:

cpp 复制代码
100 × 100 = 10000
10000 × 100 = 1000000

刚好 1000000,可以输出。


2、如果输入:

cpp 复制代码
4
100
100
100
2

算到:

cpp 复制代码
1000000 × 2 = 2000000

超过 1000000!

所以要输出:

cpp 复制代码
>1000000

四、🌟 解题关键思想

1、💡 我们可以"边乘边检查"

不要等全部乘完才判断!

如果中途已经超过 1000000,

立刻停止!


2、这样:

✔ 更安全

✔ 不会溢出

✔ 更快


五、🎯 思路步骤图

① product = 1

② 读入一个数 a
③ 如果 product × a > 1000000
  立刻输出并结束
④ 否则
  product *= a
⑤ 重复


六、🧩 参考程序:

cpp 复制代码
#include <iostream>
using namespace std;

int main() {

    int n;
    cin >> n;   // 读入个数

    long long product = 1;  // 用 long long 防止溢出

    for(int i = 0; i < n; i++) {
        int a;
        cin >> a;

        // 先判断是否会超过1000000
        if(product * a > 1000000) {
            cout << ">1000000";
            return 0;   // 立刻结束程序
        }

        product *= a;   // 累乘
    }

    cout << product;

    return 0;
}

七、🌈 为什么要用 long long?

考试中,好习惯是用:

cpp 复制代码
long long

更安全。


八、🎯 本题考察知识点

知识 是否重要
for 循环 ⭐⭐⭐⭐
累乘 ⭐⭐⭐
提前终止 return ⭐⭐⭐⭐
数据类型 ⭐⭐⭐

九、🧩课后训练题:

(一)、🌟 训练题 1(⭐ 基础版)------ 连加限制

1、📝 题目

输入 n 个正整数,把它们依次相加。

如果和 超过 500000,立刻输出:

cpp 复制代码
>500000

否则输出总和。


2、🧠 思路

和乘法题一模一样!

区别:

  • 原来是乘法

  • 现在是加法


3、💻 参考程序

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;

    long long sum = 0;

    for(int i = 0; i < n; i++) {
        int a;
        cin >> a;

        sum += a;

        if(sum > 500000) {
            cout << ">500000";
            return 0;
        }
    }

    cout << sum;
    return 0;
}

4、📌 分析

考察:

  • 累加

  • 提前终止

  • long long


(二)、🌟 训练题 2(⭐⭐)------ 连乘防溢

1、📝 题目

输入 n 个正整数。

如果乘积 ≥ 2000000,输出:

cpp 复制代码
Too Large

否则输出乘积。


2、🧠 关键升级

这题推荐写成:

cpp 复制代码
if(product > 2000000 / a)

避免溢出!


3、💻 参考程序

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;

    long long product = 1;

    for(int i = 0; i < n; i++) {
        int a;
        cin >> a;

        if(product > 2000000 / a) {
            cout << "Too Large";
            return 0;
        }

        product *= a;
    }

    cout << product;
    return 0;
}

4、📌 分析

这是"乘法问题"的安全升级写法。


(三)、🌟 训练题 3(⭐⭐⭐)------ 阶乘限制

1、📝 题目

输入一个整数 n,计算 n!。

如果 n! > 1000000,输出:

cpp 复制代码
Overflow

否则输出 n!。


2、🧠 思路

cpp 复制代码
1 × 2 × 3 × ... × n

边乘边判断。


3、💻 参考程序

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;

    long long fact = 1;

    for(int i = 1; i <= n; i++) {
        if(fact > 1000000 / i) {
            cout << "Overflow";
            return 0;
        }
        fact *= i;
    }

    cout << fact;
    return 0;
}

4、📌 分析

考察:

  • for 循环

  • 阶乘

  • 乘法判断


相关推荐
juleskk1 小时前
2.18复试训练
算法
白太岁1 小时前
Muduo:(0) 架构与接口总览
c++·架构·tcp
闻缺陷则喜何志丹1 小时前
微分中值定理与导数的应用
c++·高等数学·微分·中值定理·导数应用
tankeven1 小时前
HJ94 记票统计
c++·算法
逆境不可逃1 小时前
LeetCode 热题 100 之 76.最小覆盖子串
java·算法·leetcode·职场和发展·滑动窗口
I_LPL2 小时前
day35 代码随想录算法训练营 动态规划专题3
java·算法·动态规划·hot100·求职面试
DeepModel2 小时前
【回归算法】多项式回归详解
算法·回归
Frostnova丶2 小时前
LeetCode 761. 特殊的二进制字符串
算法·leetcode
mjhcsp2 小时前
C++ 树形 DP解析
开发语言·c++·动态规划·代理模式