求丑数序列,底为{2,3,5,7},最高到第5842个,无符号整型就够用。
从题目中已经给出的数组启动,下面定义的指针pset[i]
int pset[4] = {12,10,6,4};
分别指向丑数序列中的一个还未乘过2,3,5,7的数
每一轮从这4个数中选出一个最小的大于当前序列最大的数,添进序列,然后重复。
稍微修改一下,就可以用来求任意底的丑数序列
//2008-01-12 23:35:12 Accepted 1095 C++ 00:00.00 436K #include<stdio.h> char* getsuffix(int k) { int lh = k%100; int lt = lh%10; if(lt==1 && lh!=11) return "st"; if(lt==2 && lh!=12) return "nd"; if(lt==3 && lh!=13) return "rd"; else return "th"; } int main() { freopen("1095.txt","r",stdin); unsigned int hn[5843]={0,1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27}; unsigned int t,min=0; int hset[4] = {2,3,5,7}; int pset[4] = {12,10,6,4}; int phn = 20; int i,mink; while(phn<=5842) { min=hn[pset[0]]*hset[0]; mink=0; for(i=1;i<4;i++) { t = hn[pset[i]]*hset[i]; if(t<min) { min = t; mink = i; } } if(min>hn[phn]) { hn[++phn]=min; pset[mink]++; } else pset[mink]++; } int n; while((scanf("%d",&n)!=EOF) && n!=0) printf("The %d%s humble number is %d./n",n,getsuffix(n),hn[n]); fclose(stdin); return 0; }