Poj 2247 Humble Numbers(求只能被2,3,5, 7 整除的数)

一、题目大意

        本题要求写出前5482个仅能被2,3,5, 7 整除的数。

二、题解

       这道题从本质上和Poj 1338 Ugly Numbers(数学推导)是一样的原理,只需要在原来的基础上加上7的运算即可。还有一个不同之处在于输出上,这个题要求第n的英语表示。而英语中的表示呢,如果n的个位数是1,用nst表示个位数是2的用,nnd表示;个位数是3的,用nrd表示。但是n的最后两位是11、12、13的还是用nth表示,其他的也是用th表示。

三、java代码

    import java.util.Scanner;  
      
    public class Main {   
        public static String format(int n){
        	if(n % 10==1 && n% 100 !=11)
        		return n+"st";
        	if(n % 10==2 && n% 100 !=12)
        		return n+"nd";
        	if(n % 10==3 && n% 100 !=13)
        		return n+"rd";
        	return n+"th";
        }
        public static void main(String[] args) {  
            Scanner sc=new Scanner(System.in);  
            int n;  
            int i2_mul;  
            int i3_mul;  
            int i5_mul;
            int i7_mul;
            long[] ugly=new long[5843];  
      
            i2_mul = 1;  
            i3_mul = 1;  
            i5_mul = 1;
            i7_mul = 1;
            ugly[1]=1;  
      
            for(  int i = 2; i <= 5842; i++ ){  
                ugly[i] = Math.min(Math.min(ugly[i2_mul]*2,
                		Math.min(ugly[i3_mul]*3,ugly[i5_mul]*5)), ugly[i7_mul]*7);  
                if(ugly[i] == ugly[i2_mul]*2 )  
                    i2_mul++;  
                if(ugly[i] == ugly[i3_mul]*3 )  
                    i3_mul++;  
                if(ugly[i] == ugly[i5_mul]*5)  
                    i5_mul++;  
                if(ugly[i] == ugly[i7_mul]*7)  
                    i7_mul++;  
            }  
      
            while((n=sc.nextInt())!=0){
                System.out.println("The "+format(n)+" humble number is "+ugly[n]+".");  
            }  
        }  
    }   


版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/AndyDai/p/4734126.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值