标题:JAVA每周一题(2)——曾经诺西的笔试题
取消只看楼主
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
结帖率:100%
已结贴  问题点数:100 回复次数:8 
JAVA每周一题(2)——曾经诺西的笔试题
求丑数:
    丑数是指那些因子只含2,3,5的数。2,3,4,5,6,8,9,10,12,15是最前面的丑数,请编写一个程序,打印出第1500个丑数。要求效率要高。
欢迎大家百度,只要能整理出尽可能快的程序就行。
 
 
 
搜索更多相关主题的帖子: 诺西 JAVA 笔试 
2010-06-25 16:23
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
得分:0 
回复 2楼 书呆
8=2×2×2,12=2×2×3,所以没错
2010-06-26 09:13
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
得分:0 
回复 3楼 lampeter123
你的程序还需要改改,因为2×i不一定是正确的,假如I=7就错误了,因为14=2×7,7不是(2,3,5)其中的一个.所有的因子都必须只能由2,3,5组成
2010-06-26 09:18
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
得分:0 
还是不对,因为假如i=14,i%2==0,但是14=2×7,treeSet.add(2*i);就是2×2×7,所以还是错误的。这道题目用
while(i%5==0){
     i=i/5;
}
while(i%3==0){
     i=i/3;
}
while(i%2==0){
    i=i/2;
}
这种方法解,虽然可以得到答案,但明显不是笔试的人想要的答案,这个效率最差了。
2010-06-26 10:01
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
得分:0 
回复 8楼 lampeter123
if(i==1||(i%2==0)||(i%3==0)||(i%5==0)) //只包含2,3,5因子,已经没有7了

假如i=14或者22,33,55,那么if()的条件为true的。以14为例,这个时候treeset.add(2*i),3*i,5*i就是28,42,70.而28=2*2*7,42=2*3*7,70=5*2*7,都含有7,所以错误
2010-06-26 15:13
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
得分:0 
这道题目很有趣的,建议学编程的人都自己动手编编,编不出来去百度查查,然后贴出自己的答案
2010-06-26 15:14
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
得分:0 
楼上的理解错了啊,并不是只有7和11不行,14也不行,17也不行。要想得到所有的,可以用循环求因子,也可以用因子积。
while(i%2==0)
    i=i/2;
while(i%3==0)
    i=i/3;
while(i%5==0)
    i=i/5;
if(i==1)
    该数就是丑数。

因子积:2×2,2×3,2×5,或者3×5,3×2.反正就是由2,3,5相乘所得的数。
2010-06-26 22:50
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
得分:0 
回复 14楼 taoyongxing
晕晕,我说的17,是指17的2,3,5的倍数呀,也就是34,68,51,102,153等等,而且还不止,还有19的2,3,5倍数,还有好多好多
2010-06-27 11:26
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
得分:0 
程序代码:
public class Perm {
    int count =0;
    int n=1;
   
    public void getAll(){
        while(true){
            int i=n;
            while(i%5==0){
                 i=i/5;
            }
            while(i%3==0){
                 i=i/3;
            }
            while(i%2==0){
                i=i/2;
            }
            if(i==1&&n!=1)
                count++;
            if(count==1500)
                break;
           
            n++;
        }
    }
   
    public static void main(String[] args) {
        Perm p = new Perm();
        p.getAll();
        System.out.println(p.n);
    }
}
程序代码:
public class Perm {
    private int a2=0,a3=0,a5=0;
    private int[] a = new int[1501];
   
    private void getNth(int n){
        a[0]=1;
        for(int i=1;i<=n;i++){
            int temp2 = 2*a[a2];
            int temp3 = 3*a[a3];
            int temp5 = 5*a[a5];
            int temp = temp2<temp3?temp2:temp3;
            temp=temp<temp5?temp:temp5;
            a[i]=temp;
            if(temp2==temp)
                a2++;
            if(temp3==temp)
                a3++;
            if(temp5==temp)
                a5++;   
        }
    }
   
    public static void main(String[] args) {
        Perm p = new Perm();
        p.getNth(1500);
        System.out.println(p.a[1500]);
    }
}
是不是这个题目有点难啊,还是大家太懒了呢。
我觉得写不出最优代码,也能写出最简单的那种呀。当时我笔试的时候,写的也是最简单的那种,主要是没有时间去考虑最优的。

这里我贴出我自己的代码,供大家参考一下吧。第一个程序是最简单的,效率很低,运行估计要等一分钟左右。其实在第二种还可以进行些小优化的,不过效果也不会很好。

2010-06-28 10:28



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-311244-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026823 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved