简单题意
有一个序列,序列每一个数所有因数(全部拆成素数),都是由2.3.5.7.组成的(数量不限),把这种数称为Humble数,给出n,求出数列第n个数应该是多少。
解题思路形成过程
若一个数是Humble数,则它的2、3、5、7倍仍然是Humble数。就是说不断找出按不同数量组成的2.3.5.7的数从小到大排序,设a2,a3,a5,a7,分别保存2.3.5.7在humble数中的组成个数,每次找出按当前比例分配最小的那个,之后把他的比例调高一个,再找下一个humble数。
感想
半夜做题,有点困。
AC代码
#include<iostream>
#include<stdio.h>
#include<fstream>
using namespace std;
int min(int a,int b){
if(a<b)return a;
return b;
}
int main(){
ifstream cin("in.txt");
freopen("in.txt","r",stdin);
int dp[5842];dp[1]=1;
int a2=1,a3=1,a5=1,a7=1;
int k=2;
while(k<=5842){
int temp=min(min(2*dp[a2],3*dp[a3]),min(5*dp[a5],7*dp[a7]));
dp[k++]=temp;
if(temp==2*dp[a2])a2++;
if(temp==3*dp[a3])a3++;
if(temp==5*dp[a5])a5++;
if(temp==7*dp[a7])a7++;
}
int n;
while(cin>>n&&n){
if(n%10==1&&n%100!=11){
cout<<"The "<<n<<"st humble number is "<<dp[n]<<"."<<endl;
}else if(n%10==2&&n%100!=12){
cout<<"The "<<n<<"nd humble number is "<<dp[n]<<"."<<endl;
}else if(n%10==3&&n%100!=13){
cout<<"The "<<n<<"rd humble number is "<<dp[n]<<"."<<endl;
}else{
cout<<"The "<<n<<"th humble number is "<<dp[n]<<"."<<endl;
}
}
return 0;
}