C++题解(33)2025年顺德区中小学生程序设计展示活动(初中组C++)U560876 美丽数(一)和 U560878 美丽数(二)题解

发布于:2025-05-25 ⋅ 阅读:(16) ⋅ 点赞:(0)

U560876 美丽数(一)

题目描述

小明很喜欢3和5这两个数字,他将能被3或5整除的数叫做美丽数。现在给你一个整数n,你能告诉小明第n个美丽数是多少吗?

输入格式

输入有多行,每行只有一个整数${n_i}$。

输出格式

输出多行,每行代表第${n_i}$个美丽数。

输入输出样例 #1

输入 
1
2
3
4

输出
3
5
6
9

说明/提示

保证:1<=n<=100000。输入行数<=5000。

参考代码

#include <iostream>
using namespace std;
int main()
{
	int n;
	while(cin>>n)
	{
		for(int i=1;n>0;i++)
		{
			if(i%3==0||i%5==0)
			{
				n--;
				if(n==0)
				{
					cout<<i<<endl;
					break;
				}
			}
		}
	}
	return 0;
}

 U560878 美丽数(二)

题目背景

【题干与《美丽数(一)》基本一致,仅规“美丽数”的定义不同】

题目描述

小明很喜欢某些数字,他将能被这些数同时整除的数叫做美丽数。现在给你一个整数n,你能告诉小明第n个美丽数是多少吗?

输入格式

第1行整数m,代表小明喜欢m个数字;

第2行有m个整数,分别以空格隔开,这些数字范围在[1,9];

接下来有多行,每行只有一个整数ni​。

输出格式

输出多行,每行代表第ni​个美丽数。

输入输出样例#1

输入 #1

2
2 3
1
2

输出 #1

6
12

说明/提示

保证:2<m<=100,1<=n<=100000。询问行数<=5000。

参考代码

#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
int n,m,a[101],l=1;

void lcm(int n) //求m个数的最小公倍数
{
	for(int i=max(l,n); ;i++)
	{
		if(i%l==0&&i%n==0)
		{
			l=i;
			break;
		}
	}
}

int main()
{
	scanf("%d",&m);
	for(int i=1;i<=m;i++)	
	{
		scanf("%d",&a[i]);
		lcm(a[i]);
	}
	while(cin>>n)
	{
		cout<<n*l<<endl;
	}
	return 0;
}

 解题思路

1.暴力求出m个数的最小公倍数 l

2.用while循环读入n

3.观察发现第n个美丽数为 n*l ,故得答案。

两题共同重难点 

重难点:如何读入多行不定个数的数据

解决方法:使用while循环,把输入数据放入小括号当做循环条件

while(cin>>n)
{
    语句1;
    语句2;
}

(可以在循环体内增加强制退出语句,如break)

测评系统运行程序时,回在输入数据末加上特定符号强制退出循环。

当我们在练习的过程中,强制退出循环可直接按 Ctrl键 + z键,最后换行。

感谢阅读,如有表述不当,可在评论区提出,作者将在3-10日内回复并修正。


网站公告

今日签到

点亮在社区的每一天
去签到