一个有序数列,序列中的每一个值都能够被2或者3或者5所整除,2是这个序列的第一个元素。  
     请写一段Java程序来求出第15000个值。
     并请考虑是否有更快的算法来实现。

解决方案 »

  1.   

    呵呵,楼上的,微软也需要java ? 晕
      

  2.   

    能被5整除的必须是末尾 0或者5  2的话必须是偶数 所以5就已经被剔除了 因此得出来的数字最后一位只能可是0 首先要明确这点
    你可以这样想  2*x + 3*y + 5*z 要求都要被整除的 那么x y z 都要大于1就好了 
    第一个数就是2×1 + 3×1 + 5×1 = 30  999到111有 999个 剩下的在后面+0就好了 多一个零就是多了999种  你可以算到15000个~ 我认为的算法大概就是这样。不知道是否符合要求。至于代码实现还需要LZ你自己去写。 呵呵。
      

  3.   


    我们用java来解决实际问题。java技术交流,讨论java的技术细节和最新技术。欢迎中高级程序员以及渴望学习java技术的初学者加入讨论。QQ群:3001581
      

  4.   

    int m=0,j=0;

    while(m < 25000){
    if(m%2 == 0 || m%3 == 0 || m%5 == 0)
    j++;
    if(j==15000)
    break;
    m++;
    }
      

  5.   

    to jlusdy(边城浪子)
     这样的算法是最简单的。LZ要的是优化算法。
      

  6.   

    int[] a=new int[]{0,2,3,4,5,6,8,9,10,12,14,15,16,18,20,21,22,24,25,26,27,28,30}
    int ret=(15000/22)*30+a[15000%22]
      

  7.   

    自己数一下嘛另:参考treeroot(旗鲁特)的解法  :)
      

  8.   

    int i=2,j;
    for(i;i<22000;i++)
    {
       if(m%2 == 0 || m%3 == 0 || m%5 == 0)
        {
          j++;
          if(j=15000)
            {
              System.out.println((chr)j);
            }
        }
    }
      

  9.   

    public class Test2 { int[] fill(){
    int[] arg = new int[1000000];
    for(int i=2; i<arg.length;i++){
    arg[i-2] = i;
    }
    return arg; }
     void printer(int[] arg){
    int[] temp =  arg;
    // for(int k = 0; k<temp.length;k++)
    // {
    // System.out.println(temp[k]);
    // }
    System.out.println("第15000个能被2,3,5整除的元素是temp[15000]= "+temp[15000]);
    }

     int[] search(int[] arg) {
            int count = 0;
            int j = 0;
    int[] temp = new int[300000];

    for (int m = 0; m < arg.length; m++) {
    if (arg[m] % 2 == 0 && arg[m] % 3 == 0 && arg[m] % 5 == 0) {
    temp[j++] = arg[m];
    //j++;
    count++;
    if (arg[m] == 1500)
    continue;
    }      
    }
    System.out.println("找到"+count+"个有效元素!");
    return temp; }

    public static void main(String[] args) {
    Test2  t = new Test2();
    int [] arg = t.fill();
    int[] temp = t.search(arg);
    t.printer(temp);}
    }找到33335个有效元素!
    第15000个能被2,3,5整除的元素是temp[15000]= 450030
      

  10.   

    我来帮spiritsl(梦雨心蓝) 补充算法,呵呵
    每30个数中有22个符合条件,15000/22=681,15000-22*681=18,
    2 3 4 5 6 8 9 10 12 14 15 16 18 20 21 22 24 25
    所以答案就是30*681+25=20455具体到第任意N个,就先除以22,得到商和余数,商*30,余数计算出来,相加即可
    由于每次只需要计算30以内的数,速度大大增加,当然还可以加一个30以内的数组对照表,不用计算直接查找加,应该是最快了
      

  11.   

    这个应该比较快一点的算法
    public class CSDN12 {
    public static void main(String[] args) {

    int count = 0;
    int MAX =  6 * 15000;
    int flag = 15000 -10;
    int tmp;
    int i=0;
    for( ; i < MAX ; i = i +10)
    {
    count += 6;
    tmp = i +1;
    if(tmp%3==0)
    count +=2;
    tmp = i +3;
    if(tmp%3==0)
    count +=2;
    if(count > flag)break;
    }
    while(count <= 15000)
    {
    i++;
    if(i%3==0||i%2==0||i%5==0)
    count++;
    }
    System.out.println(i);
    }
    }
      

  12.   

     回复人:wxg1008(嘻嘻哈哈) ( 一级(初级)) 信誉:100  2006-8-30 22:19:53  得分:0
    楼上的,觉得却是是有规律的我来帮spiritsl(梦雨心蓝) 补充算法,呵呵
    每30个数中有22个符合条件,15000/22=681,15000-22*681=18,
    2 3 4 5 6 8 9 10 12 14 15 16 18 20 21 22 24 25
    所以答案就是30*681+25=20455具体到第任意N个,就先除以22,得到商和余数,商*30,余数计算出来,相加即可
    由于每次只需要计算30以内的数,速度大大增加,当然还可以加一个30以内的数组对照表,不用计算直接查找加,应该是最快了//强
      

  13.   

    public class MathTest{


    private void searth(){
        int i,count=0;
        for (i=2;;i++)
        {
         if(i%2 == 0||i%3 == 0||i%5 == 0)
         {count++;System.out.println(i);
        }
        if(count==15000) break;

    }
    System.out.println("结果="+i);

    }

    public static void main(String [] args){
    MathTest mt = new MathTest();
    mt.searth();



    }
    结果时20455