pku 1338 Ugly Numbers
转一个分析:
这道题主要是要我们找出只含2,3,5这三个因子的数,按顺序排列出来,然后根据题目输入一个下标,程序要给出这个位置的数,如前10个这样的数是:1 , 2 , 3 , 4 , 5 , 6 , 8 , 9 , 10 , 12 .....
这题目我们都知道是找2^x*3^y*5^z中的x,y,z使得序列呈递增,那我们怎样确定x,y,z呢?这里要用到p2,p3,p5来指向这个序列,表示它们所指向的序列可以乘以2,3,5(是对应乘,即p2指向的可以乘以2,p3指向的可以乘以3,p5指向的可以乘以5),只要乘一次那么指针就向后移动一个位置,意味着下一个可以乘以2,3,5的数是哪些。这样就可以用p2,p3,p5指向的数乘以对应的值后,选择一个最小的做为序列的下一个数,以此类推下去,找出1500个这样的数,再按题目的输入打印所需要的结果。
#include <stdio.h>
#define MAXN 1501
int ugly[MAXN];
inline int Min(int a,int b){return a<b?a:b;}
void init()
{
int i,p2=1,p3=1,p5=1;
ugly[1]=1;
for(i=2;i<MAXN;i++)
{
ugly[i] = Min( ugly[p2]*2, Min(ugly[p3]*3, ugly[p5]*5));
if(ugly[i] == ugly[p2]*2) p2++;
if(ugly[i] == ugly[p3]*3) p3++;
if(ugly[i] == ugly[p5]*5) p5++;
// printf("ugly[%d]=%d\n",i,ugly[i]);
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("tdata.txt","r",stdin);
#endif
init();
int n;
while(scanf("%d",&n),n) printf("%d\n",ugly[n]);
return 0;
}
浙公网安备 33010602011771号