http://acm.hdu.edu.cn/showproblem.php?pid=5878
给出你一个数字,让你求出大于这个数字n并且是形如2^a*3^b*5^c*7^d的最小的数;
就是用打表法求出所有的数,然后通过二分来查找,否则就会超时
有一点是童鞋们需要注意的,就是在文件中自定义函数的pow返回值是double型的,在这里我们需要用的返回值是int型的,要不然就会因为系统内部的精度问而出错
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
long long int ll=1e9;
long long int ss[]; long long int pow(long long int a, long long int b)
{
long long int ans = ;
while(b)
{
if(b & )ans *= a;
a *= a;
b>>=;
}
return ans;
} int main()
{
int t;
long long int ch;
cin>>t;
while(t--){
int p=;
int n;
for(long long int i=;i<;i++)
for(long long int j=;j<;j++)
for(long long int k=;k<;k++)
for(long long int l=;l<;l++){
ch=pow(,i)*pow(,j);
if(ch>ll)break;
ch*=pow(,k);
if(ch>ll)break;
ch*=pow(,l);
if(ch>ll)break;
ss[p++]=ch;
}
sort(ss,ss+p);
cin>>n;
int l=;
int r=p-;
while(l<r){
int mid=l+(r-l)/;
if(ss[mid]>=n){
r=mid;
}
else l=mid+;
}
cout<<ss[l]<<endl; }
}