文章目录
- 前言
- 一、计数求和
- 1.导入
- 2.计数器
- 3.累加器
- 二、例题讲解
- 问题:1741 - 求出1~n中满足条件的数的个数和总和?
- 问题:1002. 编程求解1+2+3+...+n
- 问题:1004. 编程求1 * 2 * 3*...*n
- 问题:1014. 编程求1+1/2+1/3+...+1/n
- 问题:1056. 所有不超过1000的数中含有数字3的自然数
- 问题:1055. 求满足条件的整数个数
- 问题:1393. 与7无关的数?
- 三、总结
- 四、感谢
前言
在C++编程的学习过程中,循环结构是一个非常重要的概念。通过前两节的学习,我们已经掌握了while循环和for循环的基本使用方法,并且学会了如何利用这些循环来输出一组符合条件的数。然而,在实际应用中,仅仅输出这些数是不够的。很多时候我们需要进一步处理这些数据,例如统计出符合条件的数的数量以及计算它们的总和。这就是本章节的重点——循环计数求和。我们将深入探讨如何使用计数器和累加器来实现这一目标,并通过具体的实例帮助大家更好地理解和掌握这些技巧。
学习路线:C++从入门到NOI学习路线
学习大纲:C++全国青少年信息学奥林匹克竞赛(NOI)入门级-大纲
一、计数求和
1.导入
在前两节中,我们学习了两种不同的循环结构——while循环和for循环。
并学会了在一组数字中,如何输出多个符合条件的数。
让你统计出这些符合条件的数的数量是多少?并且计算出它们的和你会吗?
这就是我们今天需要学习处理的问题——循环计数求和。
2.计数器
首先我们需要知道一个关于计数器的概念,什么是计数器?
计数器用于跟踪循环执行的次数或某些事件发生的频率。它通常从一个初始值开始,在每次满足特定条件时递增或递减。
哇,好复杂,感觉要长脑子了QAQ
其实并没有那么复杂,大家可以想想比赛用的计时器。
当按下开始键,时间每过去一秒,计时器就会加1。同理,在我们程序里面,当满足条件时,我们也将计数器+1。
示例:
int c=0 //定义一个计数器,并初始化为0
for(int i=1;i<=20;++i){ //循环1-20的数
if(i%2==0){ //判断当前数是否是偶数
++c; //如何是偶数,则将计数器+1
}
}
上面代码中就演示了如何统计1-20中偶数的数量。
看见没,就是这样简单。
3.累加器
接下来,让我们来了解一下求和的部分。
累加器用来累积一系列数值的总和。在每次迭代中,将当前数值添加到累加器中,从而实现对多个数值的求和。
说到这里,大家脑子里面肯定想到了计算器这个东西。
没错,我们的累加器基于相当于是一个会自己按的计算器。当然这里的累加器也可以包括加减乘除等一系列操作,只是一般用来求和而已。
示例:
int sum=0 //定义一个累加器,并初始化为0
for(int i=1;i<=20;++i){ //循环1-20的数
sum+=i; //累计计算1-20的和
}
依然是一段很简单的代码,循环1-20的每一个数,然后将它们累计相加。
但这里有的人可能会有一点小问题。
1.问题一:sum+=i是什么意思?
- 在C++编程中,sum += i; 是一种简洁的写法,用来表示将变量 i 的值加到变量 sum 上,并将结果存回 sum 中。这实际上是一个复合赋值操作符的例子,它结合了加法运算和赋值操作。
- sum += i 可以理解为 sum = sum + i。
2.问题二:为什么sum=sum+i就是累加?
- 模拟计算器过程:想象你正在使用一个计算器来连续相加几个数字。每次你输入一个新的数并按下“等于”键时,计算器会显示当前所有已输入数值的总和。
- 累加器的角色:在这个过程中,sum 就像是计算器上的显示屏,它保存了到目前为止所有已添加数值的总和。而 i 则代表当前要加入的新值。
- 每一步的更新:在语句 sum = sum + i; 中,右边的 sum 表示的是上一次累加后的结果(也就是当前的总和),而 + i 是指现在要加到总和上去的新值。执行这行代码之后,新的总和就会被计算出来,并通过赋值操作(=)更新到左边的 sum 变量中。
- 循环中的累加:当这条语句位于一个循环体内时,随着循环的每一次迭代,i 的值会发生变化,代表着不同的新值。每次执行 sum = sum + i; 都是在前一次总和的基础上再加上新的值,从而实现了累加的效果。最终,sum 将包含所有数值的总和。
二、例题讲解
问题:1741 - 求出1~n中满足条件的数的个数和总和?
类型:简单循环
题目描述:
请求出 1∼n 之间所有满足 2 的倍数但不是 3 的倍数的数,有多少个,总和是多少?
输入:
读入一个整数 n(n≤100000) 。
输出:
输出有 2 行,每行 1 个整数;
第 1 行输出满足条件的数有几个;
第 2 行输出满足条件的数的总和。
样例:
输入:
10
输出:
4
24
1.分析问题
- 已知:给定一个整数n;
- 未知:找出1到n之间所有满足既是2的倍数但又不是3的倍数的数。需要计算满足条件的数的总数(记为c)以及这些数的总和(记为s)。
2.定义变量
- n为输入值,count记录满足条件的数的数量,sum记录这些数的总和。
// 二、数据定义
int n, count = 0, sum = 0;
3.输入数据
- 从用户处获取整数n的值。
// 三、数据输入
cin >> n;
4.数据计算
- 从2开始,每次递增2(确保是2的倍数),直到n(包含n)。
- 检查当前数i是否不是3的倍数。
- 如果i不是3的倍数,则计数加1,并将其累加到总和中
// 四、数据处理与计算
for (int i = 2; i <= n; i += 2) {
if (i % 3 != 0) {
count++; // 或者使用 ++count
sum += i;
}
}
5.输出结果
- 输出满足条件的数的总数和总和,中间用换行符分隔
cout << count << endl << sum;
完整代码如下:
#include <bits/stdc++.h> // 包含常用的C++库函数
using namespace std; // 使用std命名空间,简化对标准库函数的调用
int main() {
// 一、问题分析
// 给定一个整数n,找出1到n之间所有满足既是2的倍数但又不是3的倍数的数。
// 需要计算满足条件的数的总数(记为c)以及这些数的总和(记为s)。
// 二、数据定义
int n, count = 0, sum = 0; // n为输入值,count记录满足条件的数的数量,sum记录这些数的总和
// 三、数据输入
cin >> n; // 从用户处获取整数n的值
// 四、数据处理与计算
// 从2开始,每次递增2(确保是2的倍数),直到n(包含n)
for (int i = 2; i <= n; i += 2) {
// 检查当前数i是否不是3的倍数
if (i % 3 != 0) {
// 如果i不是3的倍数,则计数加1,并将其累加到总和中
count++; // 或者使用 ++count
sum += i;
}
}
// 五、输出结果
// 输出满足条件的数的总数和总和,中间用换行符分隔
cout << count << endl << sum;
return 0; // 程序执行成功,返回0
}
欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》
问题:1002. 编程求解1+2+3+…+n
类型:简单循环
题目描述:
编程求解下列式子的值: S=1+2+3+⋯+n。
输入:
输入一行,只有一个整数 n(1≤n≤1000) 。
输出:
输出只有一行(这意味着末尾有一个回车符号),包括 1 个整数。
样例:
输入:
100
输出:
5050
1.分析问题
- 已知:一个整数n;
- 未知:计算出1-n中所有数的和;
- 关系:计数求和。
2.定义变量
- n - 存储用户输入的上限;
- sum - 累加器,初始化为0,用来累计从1到n的整数之和。
int n,sum=0;
3.输入数据
- 输入整数n。
cin>>n;
4.数据计算
- 开始一个循环,从1遍历到n(包括n)。
- 在每次循环中,将当前的i累加到sum中。
for(int i=1;i<=n;i++){
sum+=i;
}
5.输出
- 输出结果sum。
cout << sum << endl;
完整代码如下:
#include<bits/stdc++.h> // 包含了C++标准库中的所有头文件,方便快捷但不推荐用于实际项目中。
using namespace std; // 使用std命名空间,避免每次使用标准库元素时都得加上std::前缀。
int main(){ // 定义主函数,程序从这里开始执行。
//一、分析问题
//已知:整数n。
//未知:前n项和。
//关系:累加。
//二、数据定义
int n, sum = 0; // 定义两个整型变量:
// n - 存储用户输入的上限;
// sum - 累加器,初始化为0,用来累计从1到n的整数之和。
//三、数据输入
cin >> n; // 从标准输入读取一个整数n,表示累加的上限。
//四、数据计算
for(int i = 1; i <= n; ++i){ // 开始一个循环,从1遍历到n(包括n)。
sum += i; // 在每次循环中,将当前的i累加到sum中。
}
//五、输出结果
cout << sum << endl; // 输出累加的结果,并换行。
return 0; // 主函数结束,返回0给操作系统,表示程序正常结束。
}
欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》
问题:1004. 编程求1 * 2 * 3*…*n
类型:简单循环
题目描述:
编程求 1×2×3×⋯×n 。
输入:
输入一行,只有一个整数 n(1≤n≤10);
输出:
输出只有一行(这意味着末尾有一个回车符号),包括 1 个整数。
样例:
输入:
5
输出:
120
1.分析问题
- 已知:一个整数n;
- 未知:编程求 n的阶乘。
- 关系:n 的阶乘定义为从 1 到 n 所有整数的乘积,表示为 n! = 1 * 2 * … * n。
2.定义变量
定义两个整型变量:
- n - 存储用户输入的整数;
- r - 累乘器,初始化为1,用来累计从1到n的整数乘积。
int n,r=1;
3.输入数据
- 读取一个整数n,表示要计算阶乘的数。
cin>>n;
4.数据计算
- 开始一个循环,从1遍历到n(包括n)。
- 在每次循环中,将当前的i与累乘器r相乘,并更新r。
for(int i=1;i<=n;++i){
r*=i;
}
5.输出
- 输出累乘的结果,即n的阶乘。
cout<<r;
完整代码如下:
#include<bits/stdc++.h> // 包含了C++标准库中的所有头文件,方便快捷但不推荐用于实际项目中。
using namespace std; // 使用std命名空间,避免每次使用标准库元素时都得加上std::前缀。
int main(){ // 定义主函数,程序从这里开始执行。
//一、分析问题
//已知:一个整数n
//未知:编程求 n的阶乘。
//关系:n 的阶乘定义为从 1 到 n 所有整数的乘积,表示为 n! = 1 * 2 * ... * n。
//二、数据定义
int n, r = 1; // 定义两个整型变量:
// n - 存储用户输入的整数;
// r - 累乘器,初始化为1,用来累计从1到n的整数乘积。
//三、数据输入
cin >> n; // 从标准输入读取一个整数n,表示要计算阶乘的数。
//四、数据计算
for(int i = 1; i <= n; ++i){ // 开始一个循环,从1遍历到n(包括n)。
r *= i; // 在每次循环中,将当前的i与累乘器r相乘,并更新r。
}
//五、输出结果
cout << r; // 输出累乘的结果,即n的阶乘。
return 0; // 主函数结束,返回0给操作系统,表示程序正常结束。
}
欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》
问题:1014. 编程求1+1/2+1/3+…+1/n
类型:简单循环
题目描述:
编程求 1+1/2+1/3+⋯+1/n 。
输入:
输入一行,只有一个整数 n(1≤n≤200) 。
输出:
输出只有一行(这意味着末尾有一个回车符号),包括 1 个实数。(保留 3 位小数) 。
样例:
输入:
5
输出:
2.283
1.分析问题
- 已知:一个整数n;
- 未知:编程求1+1/2+1/3+…+1/n;
- 关系:调和级数求和,即求从1到n分之一的所有项之和。
2.定义变量
- 定义一个整型变量n,用来存储用户输入的上限。
- 定义一个双精度浮点型变量r,初始化为0,用来累计调和级数的和。
int n;
double r=0;
3.输入数据
- 读取一个整数n,表示求和的上限。
cin>>n;
4.数据计算
- 开始一个循环,从1遍历到n(包括n)。
- 在每次循环中,将当前项1/i累加到r中。
- 注意使用1.0以确保除法是浮点数除法,而不是整数除法。
for(int i=1;i<=n;++i){
r+=1.0/i;
}
5.输出
- 输出累加的结果,设置输出格式为固定小数点形式,并保留三位小数。
cout<<fixed<<setprecision(3)<<r;
完整代码如下:
#include<bits/stdc++.h> // 包含了C++标准库中的所有头文件,方便快捷但不推荐用于实际项目中。
using namespace std; // 使用std命名空间,避免每次使用标准库元素时都得加上std::前缀。
int main(){ // 定义主函数,程序从这里开始执行。
//一、分析问题
//已知:一个整数n;
//未知:编程求1+1/2+1/3+...+1/n
//关系:调和级数求和,即求从1到n分之一的所有项之和。
//二、数据定义
int n; // 定义一个整型变量n,用来存储用户输入的上限。
double r = 0; // 定义一个双精度浮点型变量r,初始化为0,用来累计调和级数的和。
//三、数据输入
cin >> n; // 从标准输入读取一个整数n,表示求和的上限。
//四、数据计算
for(int i = 1; i <= n; ++i){ // 开始一个循环,从1遍历到n(包括n)。
r += 1.0 / i; // 在每次循环中,将当前项1/i累加到r中。
// 注意使用1.0以确保除法是浮点数除法,而不是整数除法。
}
//五、输出结果
cout << fixed << setprecision(3) << r; // 输出累加的结果,设置输出格式为固定小数点形式,并保留三位小数。
return 0; // 主函数结束,返回0给操作系统,表示程序正常结束。
}
欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》
问题:1056. 所有不超过1000的数中含有数字3的自然数
类型:简单循环
题目描述:
编程求出所有不超过 1000 的数中,含有数字 3 的自然数,并统计总数。
输入:
无。
输出:
输出只有一行(这意味着末尾有一个回车符号),包括 1 个整数。
样例:
输入:
输出:
1.分析问题
- 已知:无输入,直接处理范围内的数。
- 未知:求出所有不超过 1000 的数中,含有数字 3 的自然数,并统计总数。
- 关系:通过拆分每一位数字来检查是否包含数字3。
2.定义变量
- 定义一个整型变量c,初始化为0,用来累计包含数字3的数的数量。
int c=0;
3.输入数据
无。
4.数据计算
- 开始一个循环,从1遍历到999(包括999)。
- 检查当前数i的每一位是否包含数字3。
- 如果包含,则将计数器c加1。
for(int i=3;i<1000;++i){
if(i%10==3||i/10%10==3||i/100==3) ++c;
}
5.输出
- 输出包含数字3的数的总数。
cout<<c;
完整代码如下:
#include<bits/stdc++.h> // 包含了C++标准库中的所有头文件,方便快捷但不推荐用于实际项目中。
using namespace std; // 使用std命名空间,避免每次使用标准库元素时都得加上std::前缀。
int main(){ // 定义主函数,程序从这里开始执行。
//一、分析问题
//已知:无输入,直接处理范围内的数。
//未知:求出所有不超过 1000 的数中,含有数字 3 的自然数,并统计总数。
//关系:通过拆分每一位数字来检查是否包含数字3。
//二、数据定义
int c = 0; // 定义一个整型变量c,初始化为0,用来累计包含数字3的数的数量。
//三、数据输入
// 无需用户输入,直接在代码中处理1到999的所有数。
//四、数据计算
for(int i = 1; i < 1000; ++i){ // 开始一个循环,从1遍历到999(包括999)。
if(i % 10 == 3 || i / 10 % 10 == 3 || i / 100 == 3) { // 检查当前数i的每一位是否包含数字3。
++c; // 如果包含,则将计数器c加1。
}
}
//五、输出结果
cout << c; // 输出包含数字3的数的总数。
return 0; // 主函数结束,返回0给操作系统,表示程序正常结束。
}
欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》
问题:1055. 求满足条件的整数个数
类型:简单循环
题目描述:
在 1∼n 中,找出能同时满足用 3 除余 2 ,用 5 除余 3 ,用 7 除余 2 的所有整数的个数,如果没有请输出 0 。
输入:
输入一行,只有一个整数 n(1≤n≤2000) 。
输出:
输出只有一行(这意味着末尾有一个回车符号),包括 1 个整数。
样例:
输入:
100
输出:
1
1.分析问题
- 已知:一个整数n;
- 未知:找出能同时满足用 3 除余 2 ,用 5 除余 3 ,用 7 除余 2 的所有整数的个数,如果没有请输出 0 。
- 关系:逻辑运算&&。
2.定义变量
- 定义两个整型变量:n 和 计数器c。
int n,c=0;
3.输入数据
- 读取一个整数n,表示范围的上限。
cin>>n;
4.数据计算
- 开始一个循环,从1遍历到n(包括n)。
- 检查当前数i是否满足所有条件。
- 如果满足条件,则将计数器c加1。
for(int i=1;i<=n;++i){
if(i%3==2&&i%5==3&&i%7==2) ++c;
}
5.输出
- 输出个数。
cout<<c;
完整代码如下:
#include<bits/stdc++.h> // 包含了C++标准库中的所有头文件,方便快捷但不推荐用于实际项目中。
using namespace std; // 使用std命名空间,避免每次使用标准库元素时都得加上std::前缀。
int main(){ // 定义主函数,程序从这里开始执行。
//一、分析问题
//已知:一个整数n;
//未知:找出能同时满足用 3 除余 2 ,用 5 除余 3 ,用 7 除余 2 的所有整数的个数,如果没有请输出 0 。
//关系:逻辑运算符
//二、数据定义
int n, c = 0; // 定义两个整型变量:
// n - 存储用户输入的上限;
// c - 计数器,初始化为0,用来累计满足条件的整数数量。
//三、数据输入
cin >> n; // 从标准输入读取一个整数n,表示范围的上限。
//四、数据计算
for(int i = 1; i <= n; ++i){ // 开始一个循环,从1遍历到n(包括n)。
if(i % 3 == 2 && i % 5 == 3 && i % 7 == 2) { // 检查当前数i是否满足所有条件。
++c; // 如果满足条件,则将计数器c加1。
}
}
//五、输出结果
cout << c; // 输出满足条件的整数的数量。
return 0; // 主函数结束,返回0给操作系统,表示程序正常结束。
}
欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》
问题:1393. 与7无关的数?
类型:简单循环
题目描述:
一个整数,如果这个数能够被 7 整除,或者其中有一位是7,我们称为这个数是与 7 有关的数。比如: 14 能被 7 整除,17 有一位为 7 ,这两个数都是与 7有关的数。
请你编程求出 1∼n(n≤999) 中,与 7 无关的数的总和是多少?
比如 1∼10 中与 7 无关的数的和为:1+2+3+4+5+6+8+9+10=48 。
输入:
一个整数 n(n≤999) 。
输出:
1∼n 中与 7 无关的数的总和。
样例:
输入:
10
输出:
48
1.分析问题
- 已知:一个整数n;
- 未知:1-n中,与 7 无关的数的总和是多少?
2.定义变量
- n - 存储用户输入的整数;
- r - 累加器,初始化为0,用来累计满足条件的整数之和。
int n,r=0;
3.输入数据
- 输入读取一个整数n,表示范围的上限。
cin>>n;
4.数据计算
- 开始一个循环,从1遍历到n(包括n)。
- 检查当前数i是否满足以下条件:
1. 不能被7整除 (i % 7 != 0)
2. 不包含数字7 - 如果满足条件,则将当前数i累加到r中。
for(int i=1;i<=n;++i){
if(!(i%7==0 || i%10==7 || i/10%10==7 || i/100==7)){
r+=i;
}
}
5.输出
- 输出结果r。
cout<<r;
完整代码如下:
#include<bits/stdc++.h> // 包含了C++标准库中的所有头文件,方便快捷但不推荐用于实际项目中。
using namespace std; // 使用std命名空间,避免每次使用标准库元素时都得加上std::前缀。
int main(){ // 定义主函数,程序从这里开始执行。
//一、分析问题
//已知:一个整数n;
//未知:与 7 无关的数的总和是多少?
//关系:不能被7整除且不包含数字7的数。
//二、数据定义
int n, r = 0; // 定义两个整型变量:
// n - 存储用户输入的上限;
// r - 累加器,初始化为0,用来累计满足条件的整数之和。
//三、数据输入
cin >> n; // 从标准输入读取一个整数n,表示范围的上限。
//四、数据计算
for(int i = 1; i <= n; ++i){ // 开始一个循环,从1遍历到n(包括n)。
// 检查当前数i是否满足以下条件:
// 1. 不能被7整除 (i % 7 != 0)
// 2. 不包含数字7 (i % 10 != 7 && i / 10 % 10 != 7 && i / 100 != 7)
if(!(i % 7 == 0 || i % 10 == 7 || i / 10 % 10 == 7 || i / 100 == 7)) {
r += i; // 如果满足条件,则将当前数i累加到r中。
}
}
//五、输出结果
cout << r; // 输出满足条件的整数之和。
return 0; // 主函数结束,返回0给操作系统,表示程序正常结束。
}
三、总结
通过本章节的学习,我们不仅回顾了C++中的循环结构,还学习了如何利用计数器和累加器来进行复杂的数值处理。具体来说,我们了解了:
- 计数器:用于跟踪满足特定条件的事件发生的次数。它通常从一个初始值开始,在每次满足特定条件时递增或递减。
- 累加器:用来累积一系列数值的总和。通过在循环体内不断将当前数值添加到累加器中,可以实现对多个数值的求和。
此外,我们通过几个具体的编程问题,如求解调和级数、寻找与7无关的数等,展示了如何将这些概念应用于解决实际问题。
四、感谢
如若本文对您的学习或工作有所启发和帮助,恳请您给予宝贵的支持——轻轻一点,为文章点赞;若觉得内容值得分享给更多朋友,欢迎转发扩散;若认为此篇内容具有长期参考价值,敬请收藏以便随时查阅。
每一次您的点赞、分享与收藏,都是对我持续创作和分享的热情鼓励,也是推动我不断提供更多高质量内容的动力源泉。期待我们在下一篇文章中再次相遇,共同攀登知识的高峰!