符合要求的丑数只含有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; }