Skip to content

第 14 课:循环求和 ​

无论是正序还是倒序输出,蛙蛙都能将从 m 到 n 这个区间内的所有数打印出来。现在他还想将这个区间内的所有数累加在一起,并输出它们的和。

14.1 循环求和的操作 ​

氪町博士告诉蛙蛙,可以通过循环进行求和,比如要求 1 + 2 + 3 + … + 1000 的和,可以以如下方式操作。

把这个加法运算,看成一个循环的过程。用变量 s 表示运算的结果,s 的初始值为 0,依次让 s 的值增加 1, 2, …, 1000,即:

cpp
s = s + 1;
s = s + 2;
……
s = s + 1000;

这里 s 从 1 加到 1000,但使用的是顺序结构,需要写 1000 行代码。如果将其变成循环结构便可以简化代码,这里用变量 i 表示 s 每次增加的数值,i 从 1 变化到 1000,即:

cpp
for(int i = 1;i <= 1000;i++) // i 从 1 变化到 1000
{
    s = s + i; // 将 i(i 的值为 1~1000)加到 s 上
}

即:s = s + 1 + 2 + 3 + 4 + … + 1000。

最后再通过 cout << s; 语句输出 s 的值即可。完整代码如下:

cpp
#include <iostream>
using namespace std;
int main()
{
    int s = 0; // 定义一个变量 s,用于存储 1~1000 的和
    for (int i = 1; i <= 1000; i++) // i 从 1 变化到 1000
    {
        s = s + i; // 将 i(i 的值为从 1 到 1000 的整数)加到 s 上
    }
    cout << s;
    return 0;
}

编译运行后,输出的值为 500500,你成功了吗?

14.2 实例讲解 ​

例 1:整数求和 ​

自从蛙蛙解决了 1 到 1000 的所有整数求和的问题后,他觉得任意两个数之间所有数之和的问题也可以一并解决。现输入两个正整数 m 和 n,求 m 和 n 之间(包含 m 和 n)所有整数之和。

【输入格式】输入一行,为两个用空格隔开的整数 m 和 n(1 ≤ m ≤ n ≤ 1000)。

【输出格式】输出一行,一个整数,表示 m 和 n 之间所有整数的和。

【输入样例】1 5

【输出样例】15

解析

  1. 求 m 和 n 之间所有整数的和,即 m + (m + 1) + (m + 2) + … + (n − 1) + n,从 m 开始,每次加 1,可循环 (n − m + 1) 次,从 m 加到 n,即:
cpp
for(int i = m;i <= n;i++)
  1. 用 s 来保存运算结果,s 的初始值为 0,即:
cpp
int s = 0;
s = s + i; // 可简写为 s += i;(详见 1.7.5 节)

参考代码

cpp
#include <iostream>
using namespace std;
int main()
{
    int m, n, s = 0;
    cin >> m >> n;
    for (int i = m; i <= n; i++)
    {
        s += i;
    }
    cout << s;
    return 0;
}

例 2:分数求和 ​

输入一个整数 n,求 1 + 1/2 + 1/3 + … + 1/n 的和,输出结果保留两位小数。

【输入格式】输入一行,一个正整数 n(1 ≤ n ≤ 1000)。

【输出格式】输出一行,一个实数,表示求和的结果,保留两位小数。

【输入样例】8

【输出样例】2.72

解析

  1. 1 + 1/2 + 1/3 + … + 1/n,每次加一个分数,一共加 n 个数,所以应该循环 n 次,即:
cpp
for(int i = 1;i <= n;i++)
  1. 用 s 来表示运算的结果,s 应声明为实数类型变量并初始化为 0,所求结果也是实数类型,即 1/n 的结果也应为实数类型,可将 1 改为 1.0,代码如下:
cpp
double s = 0;
s += 1.0/i;

参考代码

cpp
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    double s = 0;
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        s += 1.0 / i;
    }
    printf("%.2f", s); // 通过格式化输出,将结果保留两位小数
    return 0;
}

例 3:偶数求和 ​

蛙蛙输入了两个正整数,分别是 m 和 n,他希望能求 m 和 n 之间(包含 m 和 n)所有偶数的和。

【输入格式】输入一行,两个用空格隔开的整数 m 和 n(1 ≤ m ≤ n ≤ 1000)。

【输出格式】输出一行,一个整数,表示 m 和 n 之间所有偶数求和的结果。

【输入样例】1 5

【输出样例】6

解析

  1. 要想求 m 和 n 之间所有偶数之和,需要先遍历 m 和 n 之间所有的数,这里用 i 表示,即:
cpp
for(int i = m;i <= n;i++)
  1. 本题是让我们求偶数之和,首先要先判断 i 是不是偶数(判断一个数是不是偶数,条件为:i % 2 == 0,如果条件成立,则 i 为偶数),如果 i 是偶数,就累加到 s 上(s 需要先声明并赋初始值为 0)。

  2. 然后执行 i++,一直到 n,判断是否满足 i 是偶数,如果是则继续加到 s 上面去,即:

cpp
if(i % 2 == 0)
{
    s += i;
}

参考代码

cpp
#include <iostream>
using namespace std;
int main()
{
    int s = 0, m, n;
    cin >> m >> n;
    for (int i = m;i <= n; i++)
        if (i % 2 == 0)
            s += i;
    cout << s;
    return 0;
}

例 4:奇数个数与奇数平均值 ​

蛙蛙输入 10 个正整数,想求其中奇数的个数以及奇数的平均值(求出的结果只取整数部分即可)。

【输入格式】输入一行,10 个用空格隔开的整数 a(1 ≤ a ≤ 1000)。

【输出格式】输出一行,两个用空格隔开的整数,分别表示奇数个数、奇数平均值。

【输入样例】1 2 3 4 5 6 7 8 9 10

【输出样例】5 5

解析

  1. 输入 10 个数,for 循环中 i 初始化为 1,i 小于或等于 10 这个条件满足时,i 每次加 1,循环体内输入(即 cin)变量 a,即:
cpp
for(int i = 1;i <= 10;i++)
{
    cin >> a;
}
  1. 判断一个数是不是奇数:我们知道判断一个数是不是偶数的方法是对 2 取余,结果为 0 则是偶数,不等于 0 为奇数,即:
cpp
if(i % 2 != 0)

参考代码

cpp
#include <iostream>
using namespace std;
int main()
{
    int s = 0, cnt = 0, a; // a 表示需要输入的数
    for (int i = 1; i <= 10; i++)
    {
        cin >> a;
        if (a % 2 != 0) // 如果 a 是奇数,则满足条件,执行下方代码
        {
            s = s + a;
            cnt++;
        }
    }
    cout << cnt << " " << s / cnt; // 输出奇数个数和奇数平均值
    return 0;
}

基于 MIT 协议发布