【NOI-题解】1741 - 求出1~n中满足条件的数的个数和总和?1002. 编程求解1+2+3+...+n1004. 编程求1 * 2 * 3*...*n1014. 编程求1+1/2+1/3+..

一、前言

欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》

本章节主要对循环计数求和的问题进行讲解,包括《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. 求满足条件的整数个数》《》题目。

二、问题

问题:1741 - 求出1~n中满足条件的数的个数和总和?

类型:简单循环


题目描述:

请求出 1∼n 之间所有满足 2 的倍数但不是 3 的倍数的数,有多少个,总和是多少?

输入:

读入一个整数 n(n≤100000) 。

输出:

输出有 2 行,每行 1 个整数;
第 1 行输出满足条件的数有几个;
第 2 行输出满足条件的数的总和。

样例:

输入:

10

输出:

4
24

在这里插入图片描述


1.分析问题

  1. 已知:给定一个整数n;
  2. 未知:找出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.分析问题

  1. 已知:一个整数n;
  2. 未知:计算出1-n中所有数的和;
  3. 关系:计数求和。

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.分析问题

  1. 已知:一个整数n;
  2. 未知:编程求 n的阶乘。
  3. 关系: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.分析问题

  1. 已知:一个整数n;
  2. 未知:编程求1+1/2+1/3+…+1/n;
  3. 关系:调和级数求和,即求从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.分析问题

  1. 已知:无输入,直接处理范围内的数。
  2. 未知:求出所有不超过 1000 的数中,含有数字 3 的自然数,并统计总数。
  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.分析问题

  1. 已知:一个整数n;
  2. 未知:找出能同时满足用 3 除余 2 ,用 5 除余 3 ,用 7 除余 2 的所有整数的个数,如果没有请输出 0 。
  3. 关系:逻辑运算&&。

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.分析问题

  1. 已知:一个整数n;
  2. 未知: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++从零基础到信奥赛入门级(CSP-J)》

在这里插入图片描述

### 计算从1到N的阶乘之编程竞赛中,计算从1到N的阶乘之是一个常见的题目。以下是实现该功能的方法以及一些注意事项。 #### 方法描述 可以通过循环来逐步累加每个数的阶乘值。由于阶乘增长非常迅速,因此需要注意据类型的选取以防止溢出。通常情况下,在C++中可以选择`unsigned long long`作为存储结果的据类型[^3]。 下面提供了一个基于C++的标准解决方案: ```cpp #include <iostream> using namespace std; int main() { unsigned int n; cout << "Enter a positive integer: "; cin >> n; unsigned long long sum = 0; // 存储最终的结果 unsigned long long factorial = 1; // 当前的阶乘值 for (unsigned int i = 1; i <= n; ++i) { factorial *= i; // 更新当前阶乘值 sum += factorial; // 累加至总和 } cout << "Sum of factorials from 1 to " << n << " is: " << sum << endl; return 0; } ``` 此代码片段展示了如何通过简单的迭代方法完成任务。注意这里使用了`unsigned long long`以适应较大的值范围。 对于Python而言,其内置的大整支持使得处理此类问题更加简便: ```python def factorial_sum(n): total, fact = 0, 1 for i in range(1, n + 1): fact *= i # Update the current factorial value. total += fact # Add it to the running total. return total n = int(input("Enter a number: ")) print(f"The sum of factorials up to {n} is:", factorial_sum(n)) ``` 上述Python版本无需担心据类型的选择问题,因为Python自动管理大整运算[^1]。 #### 性能优化建议 当面对更大的输入规模时,应考虑算法的时间复杂度与空间复杂度。尽管本题目的直接解法已经足够高效,但在更复杂的场景下可能还需要引入动态规划或其他高级技巧[^2]。 另外,利用标准模板库(STL),如向量(vector)或者列表(list),可以帮助更好地管理操作大量中间结果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明月别枝惊鹊丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值