【ZZ】简单介绍丑数解法

Posted on 2012-10-17 17:05  真实的幻术师  阅读(194)  评论(0编辑  收藏  举报

丑数:质因子只有2,3,5的数,假定1也是丑数

【ZZ】假设数组ugly[N]中存放不断产生的丑数,初始只有一个丑数ugly[0]=1,由此出发,下一个丑数由因子2,3,5竞争产生,得到ugly[0]*2, ugly[0]*3, ugly[0]*5, 显然最小的那个数是新的丑数,所以第2个丑数为ugly[1]=2,开始新一轮的竞争,由于上一轮竞争中,因子2获胜,这时因子2应该乘以ugly[0+1]才显得公平,得到ugly[1]*2,ugly[0]*3,ugly[0]*5, 因子3获胜,ugly[2]=3,同理,下次竞争时因子3应该乘以ugly[0+1],即:ugly[1]*2, ugly[1]*3, ugly[0]*5, 因子5获胜,得到ugly[3]=5,重复这个过程,直到第n个丑数产生。总之:每次竞争中有一个(也可能是两个)因子胜出,下一次竞争中 胜出的因子就应该加大惩罚!

PS:设:2,3,5需要乘的数在ugly数组中的下标分别是top[0],top[1],top[2]。当出现多个相同值时,优先取2的结果,再3,最后取5,但是因子top[1]或者top[2]也要自加1,否则会出现重复数字

代码如下:
#include<stdio.h>
#define MAXLEN 1501
long long ugly[MAXLEN];
void getAllUgly()
{
int to[3] = {0,0,0};
int len = 1;
int t;
int i;
int count = 1;
while(len<1500)
{
t = ugly[to[0]]*2;
i = 0;
if(t>ugly[to[1]]*3)
{
t = ugly[to[1]]*3;
i = 1;
}
else
{
if(t == ugly[to[1]]*3)
to[1]++;
}
if(t>ugly[to[2]]*5)
{
t = ugly[to[2]]*5;
i = 2;
}
else
{
if(t == ugly[to[2]]*5)
to[2]++;
}
to[i]++;
ugly[len++] = t;
}
}
void main()
{
int i;
int n;
ugly[0] = 1;
getAllUgly();
//for(i=0;i<1500;++i)
// printf("%lld ",ugly[i]);
//printf("\n");
while(scanf("%d",&n)!=EOF)
{
printf("%lld\n",ugly[n-1]);
}
}

 

原文:http://blog.sina.com.cn/s/blog_9dfc6f5f01015nu7.html

Copyright © 2024 真实的幻术师
Powered by .NET 8.0 on Kubernetes