zoukankan      html  css  js  c++  java
  • POJ 1338 Ugly Numbers

    Ugly Numbers
    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 20294   Accepted: 9018

    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. 

    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
    

    Source




    刚開始这样做。为什么不正确啊~

    #include <iostream>
    #include <algorithm> 
    #include <stdlib.h>
    using namespace std;
    int cmp(const void *a,const void *b)
    {
    return *(int *)a-*(int *)b;
    }
    int main()
    {
        int n;
    	while(cin>>n&&n)
    	{
    		long int i,j,k,t=0,a[1505];
    		long int limit=100000000;
    		for(i=1;i<limit;i=i*2)
    			for(j=1;i*j<limit;j=j*3)
    				for(k=1;i*j*k<limit;k=k*5)
    				{
    					a[t]=i*j*k;
    					t++;
    				}
    				qsort(a,t,sizeof(int),cmp);
    				cout<<a[n-1]<<endl;
    	}
        return 0;
    }

    更新:我的while大循环放在打表外面了。应该放在最后面。

    并且我的循环控制结束语句也错了,为什么要增加

    i*j*k<limit

    这几句呢?

    附ac代码:

    #include <iostream>
    #include <algorithm>
    using namespace std;
    int main()
    {
        int n;
    	int i,j,k,t=0,a[2000];
    	int max=1000000000;
    	for(i=1;i<max&&t<2000;i=i*2)
    		for(j=1;i*j<max&&i==i*j/j&&t<2000;j=j*3)
    			for(k=1;i*j*k<max&&i==i*j*k/j/k&&t<2000;k=k*5)
    			{
    				a[t]=i*j*k;
    				t++;
    			}
    			sort(a,a+t);
    			while(cin>>n&&n)
    				cout<<a[n-1]<<endl;
    			return 0;
    }
    

    附0MS.

    #include<iostream>
    using namespace std;
    int main(void)
    {
        int n;
        while(cin>>n&&n)
        {
    		int a[1505]={0};
    		int m2=0,m3=0,m5=0,i,t;
    		a[0]=1;
    		for(i=1;i<1500;i++)
    		{
    			if(2*a[m2]>3*a[m3])
    				t=a[m3]*3;
    			else
    				t=a[m2]*2;
    			if(t>a[m5]*5)
    				t=a[m5]*5;
    			
    			if(t == 2*a[m2])
    				m2++;
    			if(t == 3*a[m3]) 
    				m3++;
    			if(t == 5*a[m5])
    				m5++;
    			
    			a[i]=t;
    		}
    		cout<<a[n-1]<<endl;
        }
        return 0;
    }
    
    






    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    常见Linux命令学习
    文件扩展名是什么?有什么用?通俗易懂的文件扩展名讲解!
    Xshell 6访问VMware Workstation Pro的虚机 CentOS 7
    Linux 常见目录
    集群
    MySQL问题记录——导入导出权限设置
    刷脸支付袭来,WeChat Pay &amp; AliPay争宠,究竟谁能笑到最后?
    Linux学习Day3:新手必须掌握的Linux命令(二)
    linux目录结构详解
    linux入门系列15--文件传输之vsftp服务
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4679243.html
Copyright © 2011-2022 走看看