C++题解(33)2025年顺德区中小学生程序设计展示活动(初中组C++)U560876 美丽数(一)和 U560878 美丽数(二)题解
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日内回复并修正。