只包含因子2 3 5的数(51NOD 1010)

K的因子中只包含2 3 5。满足条件的前10个数是:2,3,4,5,6,8,9,10,12,15。
所有这样的K组成了一个序列S,现在给出一个数n,求S中 >= 给定数的最小的数。
例如:n = 13,S中 >= 13的最小的数是15,所以输出15。
 

Input

第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000) 
第2 - T + 1行:每行1个数N(1 <= N <= 10^18)

Output

共T行,每行1个数,输出>= n的最小的只包含因子2 3 5的数。

Sample Input

5
1
8
13
35
77

Sample Output

2
8
15
36
80

思路:

1.第一感觉是把n拿来分解,可以分解把分解出来的值乘给另一个初始化为s=1,都不能分解成2,3,5,那么n++;但是理想很丰满显示呵呵哒你一脸,我连答案都输不出来,错误的也没有,emmm。

2.所以,果断上别人正确的代码及自己的理解:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<cstring>
 7 #include<string>
 8 #include<map>
 9 using namespace std;
10 long long t,x=0;
11 long long n,a[100000];
12 const long long maxn=1e18+1000;
13 void init()//打表
14 {
15     long long i,j,k;
16     for(i=1;i<maxn;i=i*2)
17     {
18         for(j=1;j*i<maxn;j=j*3)
19         {
20             for(k=1;i*j*k<maxn;k=k*5)
21             {
22                 a[x]=i*j*k;
23                 x++;
24             }
25         }
26     }
27 }
28 int main()
29 {
30     init();
31     sort(a,a+x);
32     cin>>t;
33     while(t--)
34     {
35         cin>>n;//可以用二分,自行百度.
36         cout<<*lower_bound(a+1,a+x,n)<<endl;//如果把lower理解成插入一个数是比较好理解的.但返回的只是下标.
37     }
38     return 0;
39 }

猜你喜欢

转载自www.cnblogs.com/chuixulvcao/p/9142761.html