返回 课程

信奥AC之路-1级

0% 完成
0/0 步骤
  1. 第1课 开发环境与基础输出
    5 主题|小节
  2. 第2课 算术运算符
    7 主题|小节
  3. 第3课 printf与运算输出
    7 主题|小节
  4. 第4课 数的进制与拆位
    6 主题|小节
  5. 第5课 变量与基础运算
    17 主题|小节
  6. 第6课 常量与取整运算
    8 主题|小节
  7. 第7课 关系运算
    8 主题|小节
  8. 第8课 逻辑运算
    9 主题|小节
  9. 第9课 输入与计算进阶
    10 主题|小节
  10. 第10课 if语句及双分支语句
    8 主题|小节
  11. 第11课 if语句及双分支进阶
    11 主题|小节
  12. 第12课 三目运算
    9 主题|小节
  13. 第13课 多分支、多if和switch语句
    11 主题|小节
  14. 第14课 循环(基本输出)
    7 主题|小节
  15. 第15课 循环(While+If)
    8 主题|小节
  16. 第16课 循环(计数、求和、求乘积)
    10 主题|小节
  17. 第17课 循环进阶(While+)
    8 主题|小节
  18. 第18课 do-while及while其他用法
    8 主题|小节
  19. 第19课 For循环基础
    9 主题|小节
  20. 第20课 For循环进阶
    8 主题|小节
课 16, 主题|小节 4
进行中

16.3 循环求乘积

2025年9月22日
课 进展
0% 完成

16.3.1 求乘积的基本概念

“求乘积就是计算多个数相乘的结果。比如,我们要计算n的阶乘(1×2×3×…×n),就需要使用循环求乘积。”

求乘积的基本思路:

  1. 定义一个乘积变量(通常命名为product或直接用特定含义的名称如factorial),初始值设为1
  2. 使用循环遍历所有可能的数
  3. 在循环中判断每个数是否满足条件,如果满足,将该数乘入乘积变量中
  4. 循环结束后,乘积变量的值就是满足条件的数的乘积

16.3.2 实验一:计算n的阶乘

题目描述: 输入一个正整数n,计算并输出n的阶乘(n!)。

样例输入

5

样例输出

120

代码实现

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    
    int fact = 1;  // 乘积变量初始化为1
    int i = 1;     // 从1开始乘
    
    while(i <= n) {  // 循环到n
        fact *= i;  // 乘到乘积中
        i++;        // 循环变量加1
    }
    
    cout << fact;  // 输出阶乘结果
    return 0;
}

思考

  1. 为什么fact的初始值设为1而不是0?
  2. 对于n=5,阶乘的计算过程是怎样的?

解释

  1. fact初始化为1是因为任何数乘以0都是0。如果初始化为0,结果永远是0。而任何数乘以1等于它本身,不影响结果。
  2. 5的阶乘计算过程:
    • 初始值:fact = 1
    • i=1时:fact = 1 * 1 = 1
    • i=2时:fact = 1 * 2 = 2
    • i=3时:fact = 2 * 3 = 6
    • i=4时:fact = 6 * 4 = 24
    • i=5时:fact = 24 * 5 = 120
    • 最终结果:fact = 120

16.3.3 实验二:计算1~n之间所有数的阶乘和

题目描述: 输入一个正整数n,计算并输出1到n的所有数的阶乘之和(1! + 2! + 3! + … + n!)。

样例输入

3

样例输出

9

代码实现

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    
    int sum = 0;   // 总和变量初始化为0
    int fact = 1;  // 阶乘变量初始化为1
    int i = 1;     // 从1开始循环
    
    while(i <= n) {  // 循环到n
        fact *= i;   // 计算i的阶乘
        sum += fact; // 加到总和中
        i++;         // 循环变量加1
    }
    
    cout << sum;  // 输出阶乘和
    return 0;
}

思考

  1. 算法如何避免重复计算每个数的阶乘?
  2. 对于n=3,阶乘和的计算过程是怎样的?

解释

  1. 通过在循环中连续计算阶乘,利用了阶乘的递推关系:n! = (n-1)! × n。每次循环,我们使用上一步计算的(i-1)!结果,乘以当前的i,得到i!,这样避免了重复计算。
  2. 3的阶乘和计算过程:
    • i=1时:fact = 1, sum = 0 + 1 = 1
    • i=2时:fact = 1 * 2 = 2, sum = 1 + 2 = 3
    • i=3时:fact = 2 * 3 = 6, sum = 3 + 6 = 9
    • 最终结果:sum = 9

16.3.4 实验三:计算等差数列

题目描述: 输入三个正整数a、d和n,其中a是等差数列的首项,d是公差,n是项数,计算并输出该等差数列的前n项之和。

样例输入

1 2 5

样例输出

35

代码实现

#include <iostream>
using namespace std;

int main() {
    int a, d, n;
    cin >> a >> d >> n;
    
    int sum = 0;  // 总和变量初始化为0
    int term = a; // 当前项,初始为首项a
    int i = 1;    // 从第1项开始
    
    while(i <= n) {  // 循环到第n项
        sum += term;     // 加到总和中
        term += d;       // 计算下一项
        i++;             // 项数加1
    }
    
    cout << sum;  // 输出总和
    return 0;
}

优化版本

#include <iostream>
using namespace std;

int main() {
    int a, d, n;
    cin >> a >> d >> n;
    
    // 使用等差数列求和公式:Sn = n*(a1 + an)/2,其中an = a1 + (n-1)*d
    int last_term = a + (n - 1) * d;  // 最后一项
    int sum = n * (a + last_term) / 2; // 等差数列求和公式
    
    cout << sum;  // 输出总和
    return 0;
}

思考

  1. 等差数列的特点是什么?
  2. 优化版本使用了什么公式计算总和?

解释

  1. 等差数列的特点是相邻两项的差值相等,即公差d相同。
  2. 优化版本使用了等差数列求和公式:Sn = n*(a1 + an)/2,其中an = a1 + (n-1)*d,a1是首项,n是项数。