Ugly Numbers
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 22951 | Accepted: 10204 |
Description
Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence
1, 2, 3, 4, 5, 6, 8, 9, 10, 12, ...
shows the first 10 ugly numbers. By convention, 1 is included.
Given the integer n,write a program to find and print the n'th ugly number.
1, 2, 3, 4, 5, 6, 8, 9, 10, 12, ...
shows the first 10 ugly numbers. By convention, 1 is included.
Given the integer n,write a program to find and print the n'th ugly number.
Input
Each line of the input contains a postisive integer n (n <= 1500).Input is terminated by a line with n=0.
Output
For each line, output the n’th ugly number .:Don’t deal with the line with n=0.
Sample Input
1 2 9 0
Sample Output
1 2 10
解释
每一个数必然满足,另外要注意重复
Code
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
const int maxn(1500);
long longugly_numbers[maxn];
priority_queue <longlong > state_ugly_numbers;
void init()
{
ugly_numbers[0]=1;
state_ugly_numbers.push(-2);
state_ugly_numbers.push(-3);
state_ugly_numbers.push(-5);
long long now;
for(int i=1;i<maxn;i++)
{
do
{
now=state_ugly_numbers.top();
state_ugly_numbers.pop();
}while(now==-ugly_numbers[i-1]);/****可能会出现重复*****/
ugly_numbers[i]=-now;
state_ugly_numbers.push(now*2);
state_ugly_numbers.push(now*3);
state_ugly_numbers.push(now*5);
}
}
int main()
{
init();
int n;
while(scanf("%d",&n),n)
{
cout<<ugly_numbers[n-1]<<endl;
}
return 0;
}