符合要求的丑数只含有2、3、5、7的质因子 求前5842个丑数
解题思想为:下一个最小的丑数一定在它前面的每个元素分别与2、3、5、7的乘积的结果中产生 而实际上只需跟踪4个数列即f[a]*2, f[b]*3, f[c]*5, f[d]*7 且为每个数列中满足条件的最小值 若f[a]*2被选中 则下轮应由f[a+1]*2代替为候选 不过由于不能保证四个序列没有相同的数值 如f[a]=3 f[b]=2时有f[a]*2==f[b]*3==6 故设bool m[4]为最小值的标记 于是在替换时根据标记替换对应元素
本题一开始没能AC 百度了其他人的程序才发现 只有if(n%10==1)就让后缀为st是不对滴 要if( n%10==1 && n%100!=11 )才行 这分明是在考英语啊 还是个平时基本不用的被扔在记忆角落的生僻知识 枉费六级裸考600分了
#include <iostream>
#include <string>
using namespace std;
int f[5843];
bool m[4];
int FourInLove(int p, int q, int s, int t){
int mini;
mini = min( min(p,q), min(s,t) );
for(int i=0; i<4; i++ )
m[i] = false;
if ( mini == p ) m[0] = true;
if ( mini == q ) m[1] = true;
if ( mini == s ) m[2] = true;
if ( mini == t ) m[3] = true;
return mini;
}
void init(){
int a, b, c, d;
a = b = c = d = 1;
f[1] = 1;
for(int i=2; i<=5842; i++ ){ //5842
f[i] = FourInLove( f[a]*2, f[b]*3, f[c]*5, f[d]*7 );
if ( m[0] ) a++;
if ( m[1] ) b++;
if ( m[2] ) c++;
if ( m[3] ) d++;
//cout << i << " " << index << " " << a << b << c << d << endl;
}
}
int main()
{
init();
int n;
string fix;
//for(int i=2; i<=50; i++ )
// cout << "f[" << i<< "]= " << f[i] << endl;
while( cin >> n && n!=0 ){
if( n%10==1 && n%100!=11 )
fix = "st";
else if( n%10 == 2 && n%100 != 12 )
fix = "nd";
else if( n%10 == 3 && n%100 != 13 )
fix = "rd";
else fix = "th";
cout << "The " << n << fix << " humble number is " << f[n] << "." << endl;
}
//system("pause");
return 0;
}