Problem D

简单题意

有一个序列,序列每一个数所有因数(全部拆成素数),都是由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;
}

你可能感兴趣的:(dp)