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日内回复并修正。