1004 Problem D
题意:一个数如果它的素数因子是2、3、5、7,则这个数是丑数,给定任意一个数,输出它的丑数。(The sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18,20, 21, 24, 25, 27, ... shows the first 20 humble numbers. )
思路:由题意可以看出,以2、3、5、7为基数,从f[1]=1开始的数,依次乘以2、3、5、7,最后得到一个有小到大的数列。
感想:第i个数的值,与前i-1中的某个数有关,这里采取了一个技巧,让数列从第i-1个数开始,倒序与2、3、5、7相乘,最终得到的最小数放入数组。
#include<iostream>
using namespace std;
int n,i,j,k;
long long f[5843];
int main(){
intprime[4]={2,3,5,7};
f[1]=1;
for(i=2;i<=5842;i++){
f[i]=2000000001;
for(j=0;j<4;j++)
for(k=i-1;k>=1;k--){
//如果f[i]<f[i-1],则退出循环
if(f[k]*prime[j]<=f[i-1]) break;
if(f[k]*prime[j]<f[i]) //从i-1开始倒序循环,保证放入数组中的满足题意的f[i]最小
f[i]=f[k]*prime[j];
}
}
while(cin>>n&&n!=0){
if(n%10==1&&n%100!=11)
cout<<"The "<<n<<"st humble number is"<<f[n]<<"."<<endl;
elseif(n%10==2&&n%100!=12)
cout<<"The"<<n<<"nd humble number is"<<f[n]<<"."<<endl;
elseif(n%10==3&&n%100!=13)
cout<<"The "<<n<<"rd humble number is"<<f[n]<<"."<<endl;
else
cout<<"The "<<n<<"th humble number is"<<f[n]<<"."<<endl;
}
return 0;
}