【NOI-题解】1448. 随机体能测试1469. 数的统计1511. 数字之和为13的整数1846. 阿尔法乘积

一、前言

本章节主要对嵌套循环的题目进行讲解,包括《1448. 随机体能测试》《1469. 数的统计》《1511. 数字之和为13的整数》《1846. 阿尔法乘积》。

二、问题

问题:1448. 随机体能测试

类型:循环应用,嵌套循环


题目描述:

学校想随机抽取一部分同学参加体能测试,看看同学们的体能怎么样。
张老师想了一个办法,找出学号中含有 1 的同学,让他们参加体能测试;如果某同学的学号含有 1 个 1 ,那么要测试 1 次,如果含有 2 个 1 ,就要参加 2 次测试。
比如:小明同学的学号为 1211 ,那么他就要参加 3 次测试。
请问,学号 1∼n 中的同学们,总共要参加多少次测试?

输入:

一个整数 n(n≤9999) 。

输出:

一个整数,代表 1∼n 号同学总共要参加测试的次数。

样例:

输入:

11

输出:

4

在这里插入图片描述


1.分析问题

  1. 已知:随机抽取一部分同学参加体能测试。
  2. 未知:学号 1∼n 中的同学们,总共要参加多少次测试?
  3. 关系:学号中含有 1 的同学,让他们参加体能测试;如果某同学的学号含有 1 个 1 ,那么要测试 1 次,如果含有 2 个 1 ,就要参加 2 次测试。

2.定义变量

  • n:用户输入的正整数,代表范围上限。
  • c:计数器,用于累计数字1出现的次数,初始化为0。
  • t:临时变量,用于在循环中存储当前处理的数字并逐步分解它来查找数字1。
	//二、数据定义 
	int n,c=0,t;

3.输入数据

  • 从标准输入读取一个正整数n。
//三、数据输入 
	cin>>n;

4.数据计算
使用一个for循环遍历1到n(包括n)。

  • 对于每个数i:
  • 将i的值赋给t,用于处理这个数字。
  • 使用一个while循环处理t,直到t变为0。
  • 在while循环内部,使用条件语句if(t % 10 == 1)检查当前数字的个位数是否为1,如果是,则增加计数器c的值。
  • 然后,通过t /= 10;将t除以10并向下取整,相当于去掉当前的个位数,继续检查下一位。
//四、数据计算 
	for(int i=1;i<=n;i++){
		t=i;
		while(t){
			if(t%10==1){
				++c;
			}
			t/=10;
		}
	}

5.输出结果

  • 输出最终计数器c的值,即1到n之间数字1出现的总次数。
//五、输出结果
	cout<<c; 
	return 0;

完整代码如下:

#include <bits/stdc++.h> // 引入常用的STL库,以简化代码编写
using namespace std; // 使用std命名空间,避免需要前缀std::

int main() {
    // 问题描述:
    // 假设有1到n号同学,需要根据他们的学号中数字'1'的出现次数来决定参加体能测试的次数。
    // 学号中每出现一个'1',对应的学生就需要参加一次测试。

    // 数据定义:
    int n, c = 0, t; // n: 学生总数, c: 测试总次数(初始化为0), t: 临时变量,用于逐位检查学号

    // 数据输入:
    cin >> n; // 从用户那里获取学生总数n

    // 数据计算:
    // 遍历每一个学生的学号,从1到n
    for(int i = 1; i <= n; i++) {
        t = i; // 将当前学生学号i赋值给t,开始检查
        // 使用带余除法逐位检查学号中的每一个数字是否为1
        while(t) { 
            if(t % 10 == 1) { // 如果当前位数字是1
                ++c; // 测试次数加一
            }
            t /= 10; // 去掉当前最低位,检查下一位
        }
    }

    // 输出结果:
    // 打印总共需要参加测试的次数
    cout << c; 

    return 0; // 主函数正常结束
}

问题:1469. 数的统计

类型:嵌套循环


题目描述:

试计算在区间 1 到 n 的所有整数中,数字 x ( 0≤x≤9 )共出现了多少次?
例如,在 1 到 11 中,即在 1,2,3,4,5,6,7,8,9,10,11 中,数字 1 出现了 4 次。
再比如,1 到 11 中,数字 0 只出现了 1 次。

输入:

2 个整数 n 和 x 之间用一个空格隔开。( n 是一个 int 范围内的整数)

输出:

1 个整数,表示 x 出现的次数。

样例:

输入:

11 1

输出:

4

在这里插入图片描述


1.分析问题

  1. 已知:1-n的所有整数,数字x;
  2. 未知:数字x在1-n中出现的次数 。
  3. 关系:

2.定义变量

  • 声明了三个整型变量,n代表上界(即1到n之间的n),x是要查找的数字,c用于计数x出现的次数,初始化为0。
	//二、数据定义 
	int n,x,c=0; 

3.输入数据

  • 从标准输入接收两个整数,第一个是n,第二个是x。
//三、数据输入 
	cin>>n>>x;

4.数据计算

通过两层循环实现:

  • 外层循环:for(int i=1; i<=n; i++),遍历1到n之间的每个整数。
  • 内层循环(实际上是处理单个整数的循环):while(temp),当temp非零时继续循环,用于逐位检查当前整数的每一位是否等于x。
    • temp=i;:将当前遍历到的整数赋值给temp。
    • if(temp%10==x) ++c;:判断temp的个位数是否等于x,如果是,则c加1。
    • temp/=10;:将temp除以10并去掉个位数,以便检查下一位。
//四、数据计算 
	int temp;
	for(int i=1;i<=n;i++){
		temp=i;
		while(temp){
			if(temp%10==x) ++c;
			temp/=10;
		}
	}

5.输出结果

  • 输出数字x在1到n之间出现的总次数。
	//五、输出结果 
	cout<<c;

完整代码如下:

#include <bits/stdc++.h> // 引入标准库文件,包含了很多常用的头文件,方便编程
using namespace std; // 使用标准命名空间std,省略后续代码中的std::前缀

int main() {
    // 一、问题分析:
    // 已知条件:一个整数范围1到n,以及一个目标数字x。
    // 未知:数字x在1到n之间所有整数里出现的总次数。
    // 关系:需要遍历1到n之间的每个数,检查每个数里数字x出现的次数并累加。

    // 二、数据定义:
    int n, x, c = 0; // n: 上限值, x: 目标数字, c: 计数器(记录x出现的次数)

    // 三、数据输入:
    cin >> n >> x; // 从用户处读取n和x的值

    // 四、数据计算:
    int temp; // 临时变量,用于分解当前处理的数字
    for(int i = 1; i <= n; i++) { // 遍历1到n之间的每个整数
        temp = i; // 将当前数i赋值给temp,准备分解
        while(temp) { // 当temp不为0时,继续循环
            if(temp % 10 == x) ++c; // 检查temp的个位数是否等于x,如果是则c加1
            temp /= 10; // temp除以10,丢弃个位,继续检查下一位
        }
    }

    // 五、输出结果:
    cout << c; // 输出数字x在1到n之间出现的总次数

    return 0; // 程序执行成功结束,返回0
}

问题:1511. 数字之和为13的整数

类型:简单循环、嵌套循环


题目描述:

求出 1∼n 范围内的整数,使其数字之和为 13,请问这样的数有多少个?
例如:数 85 ,其数字之和为 8+5=13 ;数 373,其数字之和为 3+7+3=13 。

输入:

一个整数 n(n≤10000000);

输出:

输出一个整数,代表符合条件数的总个数。

样例:

输入:

1000

输出:

75

在这里插入图片描述


1.分析问题

  1. 已知:1-n所有的整数;
  2. 未知:符合条件的数的个数;
  3. 关系:各数位之和为13;

2.定义变量

  • n表示上界,即考虑的整数范围到n为止;c用于计数满足条件的数的数量,初始化为0。
	//二、数据定义 
	int n,c=0;

3.输入数据

  • 从用户输入获取整数n,作为数的上界。
	//三、数据输入 
	cin>>n;

4.数据计算

双重循环结构实现:

  • 外层循环:for(int i=1; i<=n; i++),遍历1到n之间的每个整数。
  • 内层逻辑:
    • temp临时存储当前遍历到的数,sum用于累加当前数的各位数字之和。
    • 当temp不为0时进入循环,逐位相加。
      • 累加temp的个位数到sum。
      • 去掉temp的个位数,继续处理下一位。
  • 如果累加和等于13,则符合条件,c自增。
	//四、数据计算
	int temp,sum; 
	for(int i=13;i<=n;i++){
		temp=i;
		sum=0;
		while(temp){
			sum+=temp%10;
			temp/=10;
		}
		if(13==sum) ++c;
	}

5.输出结果

  • 输出符合条件的数的个数。

	//五、输出结果 
	cout<<c;

完整代码如下:

#include <bits/stdc++.h> // 包含大量常用头文件的预编译库,方便编程但可能影响编译速度
using namespace std; // 使用std命名空间,可以直接调用std中的函数和对象,无需前缀

int main() {
    // 问题分析:
    // 已知条件:考虑1到n范围内的所有整数。
    // 目标:找出所有数位之和等于13的整数,并统计这些数的总数。
    // 关系:需要遍历每个数,计算其各位数字之和,并检查是否等于13。

    // 数据定义:
    int n, c = 0; // n: 上界,即考虑的整数范围最大值, c: 计数器,记录符合条件的数的数量

    // 数据输入:
    cin >> n; // 从标准输入读取整数n,作为上界

    // 数据计算:
    int temp, sum; // temp用于暂存当前遍历的数,sum用于计算当前数的位数之和
    for(int i = 1; i <= n; i++) { // 遍历从1到n的每一个整数
        temp = i; // 将当前遍历的数i赋值给temp
        sum = 0; // 初始化sum为0,用于累加当前数的位数和
        while(temp) { // 当temp不为0时循环,即继续处理当前数的位
            sum += temp % 10; // 取temp的个位数并加到sum上
            temp /= 10; // 去掉temp的个位数,继续处理下一位
        }
        if(13==sum ) ++c; // 如果当前数的位数之和等于13,则c计数器加1
    }

    // 输出结果:
    cout << c; // 输出满足条件的数的数量

    return 0; // 程序执行完毕,返回0表示成功
}

问题:1846. 阿尔法乘积

类型:嵌套循环,循环应用


题目描述:

计算一个整数的阿尔法乘积。对于一个整数 x 来说,它的阿尔法乘积是这样来计算的:如果 x 是一个个位数,那么它的阿尔法乘积就是它本身;否则的话,x 的阿尔法乘积就等于它的各位非 00 的数字相乘所得到的那个整数的阿尔法乘积。

例如:4018224312 的阿尔法乘积等于 8 ,它是按照以下的步骤来计算的:

4018224312 → 4×1×8×2×2×4×3×1×2 → 3072 → 3×7×2 → 42 → 4×2 → 8;

编写一个程序,输入一个正整数(该整数的值在 int 范围内),输出它的阿尔法乘积。

输入:

输入只有一行,即一个正整数。

输出:

输出相应的阿尔法乘积。

样例:

输入:

3072

输出:

8

在这里插入图片描述


1.分析问题

  1. 已知:一个整数;
  2. 未知:它的连续乘积,直到结果为单个数字;
  3. 关系:通过循环不断取整数的最后一位与结果相乘,同时去掉已经处理的数字。

2.定义变量

  • 定义整型变量n,用于存储用户输入的整数。
  • 定义整型变量temp和a,分别用于临时存储整数和累积乘积。
	//二、数据定义 
	int n;  
	int temp,a;

3.输入数据

  • 使用cin>>n;从标准输入读取一个整数到变量n中。
	//三、数据输入 
	cin>>n;																																																																		

4.数据计算

  1. 外层循环:while(n >= 10)确保当整数至少为两位时进入循环。如果整数只剩一位且非零,自然就是其自身的“阿尔法乘积”,无需进一步计算。
  2. 内层循环:对于当前的n,使用temp临时保存其值,a初始化为1,用于累积乘积。
  • 在内层循环中,while(temp)确保当temp非零时继续循环。
  • if (temp % 10 != 0)检查当前位是否为零,如果不为零,则将该位数字乘以a的当前值并更新a。
  • temp /= 10;每次循环结束时,将temp除以10,丢弃最右边的一位数字,以便下一轮循环处理下一位。
  1. 当内层循环结束后,n的值被更新为a,即当前阶段的非零数字乘积。外层循环继续,直到n减少到小于10,此时n即为最终的“阿尔法乘积”。
//四、数据计算 
int temp,a;
while(n>=10){
	temp=n;
	a=1;
	while(temp){
		if (temp%10!=0) a*=temp%10;
		temp/=10;
	}
	n=a;
}

5.输出结果

  • 输出计算得到的“阿尔法乘积”。
//五、输出结果 
	cout<<n;

完整代码如下:

#include<bits/stdc++.h> 
// 引入头文件,包含了C++标准库中的所有常用组件,简化了单独引入每个所需头文件的过程。但这种做法在实际开发中并不推荐,因为它会增加编译时间和代码体积,通常建议只引入实际需要的头文件。

using namespace std;
// 使用std命名空间,这样就可以直接使用std中的函数和对象,而不需要每次都加上std::前缀。

int main(){
    // 程序的主函数入口。

    // 一、分析问题
    // 已知:一个整数;
    // 未知:它的连续乘积,直到结果为单个数字;
    // 关系:通过循环不断取整数的最后一位与结果相乘,同时去掉已经处理的数字。

    // 二、数据定义
    int n; 
    // 定义整型变量n,用于存储待处理的整数。

    // 三、数据输入
    cin>>n;
    // 从标准输入读取一个整数到变量n中。

    // 四、数据计算
    int temp, a;
    // 定义临时变量temp用于存储处理过程中的整数,a用于存储当前的乘积结果。
    while(n >= 10){
        // 当n大于等于10时,继续循环,因为单个数字不需要再处理。
        temp = n;
        a = 1;
        // 初始化temp为n,a为1,开始新的乘积计算。
        while(temp){
            // 当temp不为0时,循环处理每一位数字。
            if (temp % 10 != 0) a *= temp % 10;
            // 如果当前位数字不为0,则与a相乘。
            temp /= 10;
            // 将temp除以10,去掉已处理的最低位。
        }
        n = a;
        // 将当前的乘积结果赋给n,继续下一轮处理,直到n变成一个一位数。
    }

    // 五、输出结果
    cout<<n;
    // 输出最终的单个数字,即所有非零数字连续乘积的结果。

    return 0;    
    // 主函数结束,返回0表示程序正常执行完毕。
}

三、感谢

如若本文对您的学习或工作有所启发和帮助,恳请您给予宝贵的支持——轻轻一点,为文章点赞;若觉得内容值得分享给更多朋友,欢迎转发扩散;若认为此篇内容具有长期参考价值,敬请收藏以便随时查阅。

每一次您的点赞、分享与收藏,都是对我持续创作和分享的热情鼓励,也是推动我不断提供更多高质量内容的动力源泉。期待我们在下一篇文章中再次相遇,共同攀登知识的高峰!

在这里插入图片描述

这里是引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

明月别枝惊鹊丶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值