1.题目编号:1004
2.简单题意:一个数只有因数2,3,5或7则叫做不大数,根据它的因数可以得到一组序列数:1,2,3,4,5,6,7,8,9,10,12……输入一个数,写一个程序来输出它是序列的第几个元素。
3.解题思路形成过程:又是一个动态规划的问题,首先要把从1到5842的只有因数2,3,5或7的数找出来,如何找出来?就得要找状态方程。从1开始,可以将2,3,5,7一个一个的乘,然后找出其中的最小值,标记之后,再往下做,在得出的这个数的基础上再乘因数,最后就能得到子串~
4.感悟:还是重点找状态方程,如果找到了,题目就好做了,突然感觉代码不难,而是思想难~
5.AC的代码:
#include <iostream>
using namespace std;
int main()
{
int a[5845]={1},i,j,k,l,m,n,factor[4],min;
m = n = k = l = 1;
for(i = 1;i < 5845;i++)
{
factor[0]=a[m-1]*2;
factor[1]=a[n-1]*3;
factor[2]=a[k-1]*5;
factor[3]=a[l-1]*7;
min = factor[0];
if (factor[1] < min)
min = factor[1];
if (factor[2] < min)
min = factor[2];
if (factor[3] < min)
min = factor[3];
a[i] = min;
if(min == factor[0])
m++;
if(min == factor[1])
n++;
if(min == factor[2])
k++;
if(min == factor[3])
l++;
}
while(cin>>n&&n>=1&&n<=5842)
{
if(n % 10 == 1 && n % 100 != 11)
cout<<"The "<<n<<"st humble number is "<<a[n-1]<<"."<<endl;
else if(n % 10 == 2 && n % 100 != 12)
cout<<"The "<<n<<"nd humble number is "<<a[n-1]<<"."<<endl;
else if(n % 10 == 3 && n % 100 != 13)
cout<<"The "<<n<<"rd humble number is "<<a[n-1]<<"."<<endl;
else
cout<<"The "<<n<<"th humble number is "<<a[n-1]<<"."<<endl;
}
return 0;
}
原题:
1 2 3 4 11 12 13 21 22 23 100 1000 5842 0
The 1st humble number is 1. The 2nd humble number is 2. The 3rd humble number is 3. The 4th humble number is 4. The 11th humble number is 12. The 12th humble number is 14. The 13th humble number is 15. The 21st humble number is 28. The 22nd humble number is 30. The 23rd humble number is 32. The 100th humble number is 450. The 1000th humble number is 385875. The 5842nd humble number is 2000000000.