南邮 OJ 1167 丑陋数

丑陋数

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 424            测试通过 : 163 

比赛描述

“丑陋数”是指那些质因子只包含2,3或5的数(可以都不包含,所以1也是一个“丑陋数”)。数列1,2,3,4,5,6,8,9,10,12,...给出了前十个“丑陋数”。
给出正整数n,请输出第n个“丑陋数”。


输入

每行仅有一个正整数n(n<=1500),输入以“0”结尾。

输出

对于每一个输入的n,输出第n个“丑陋数”,对结尾的“n=0”不用作任何输出。

样例输入

1
2
9
0

样例输出

1
2
10

提示

 

题目来源

计算机学院/软件学院第二届ACM程序设计大赛



#include<stdio.h>
#define MAX_N 1501
inline long min(long a,long b){
	return a<b?a:b;
}
int main(){
	int n,i;
	long ugly[MAX_N];
	ugly[0] = 1;
	long *p2=ugly,*p3=ugly,*p5=ugly;	
	for(i=1;i<MAX_N;++i){
		ugly[i] = min(min(*p2*2,*p3*3),*p5*5);
		while(*p2*2<=ugly[i]){//*p2*2>ugly[i],所以ugly[i+1]可能就是*p2*2,当然还要跟其他两个比较,取最小值
			++p2;
		}
		while(*p3*3<=ugly[i]){
			++p3;
		}
		while(*p5*5<=ugly[i]){
			++p5;
		}
	}
	while(scanf("%d",&n)!=EOF && n){
		printf("%d\n",ugly[n-1]);
	}	
}







  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值