这道Java算法哪有问题,求大神尽量在这上面修改,如果实在不行请提供新的算法

幸运数是波兰数学家乌拉姆命名的。它采用与生成素数类似的“筛法”生成。

首先从1开始写出自然数1,2,3,4,5,6,....

1 就是第一个幸运数。
我们从2这个数开始。把所有序号能被2整除的项删除,变为:

1 _ 3 _ 5 _ 7 _ 9 ....

把它们缩紧,重新记序,为:

1 3 5 7 9 .... 。这时,3为第2个幸运数,然后把所有能被3整除的序号位置的数删去。注意,是序号位置,不是那个数本身能否被3整除!! 删除的应该是5,11, 17, ...

此时7为第3个幸运数,然后再删去序号位置能被7整除的(19,39,...)

最后剩下的序列类似:

1, 3, 7, 9, 13, 15, 21, 25, 31, 33, 37, 43, 49, 51, 63, 67, 69, 73, 75, 79, ...

本题要求:

输入两个正整数m n, 用空格分开 (m < n < 1000*1000)
程序输出 位于m和n之间的幸运数的个数(不包含m和n)。

例如:
用户输入:
1 20
程序输出:
5

例如:
用户输入:
30 69
程序输出:
8

public static void main(String[] args) {
int i, m, n, step, length;
ArrayList list = new ArrayList();
Scanner sc = new Scanner(System.in);
System.out.println("输入m n:");
m = sc.nextInt();
n = sc.nextInt();
length = 1 + Math.abs(m - n);
int value = m < n ? m : n;
for (i = 0; i < length; i++) {
list.add(value++);
}
System.out.println(list);
step = 1;
int j;
while (step < list.size()) {
step++;
for (j = 0; j < list.size(); j++) {
if ((j + 1) % step == 0) {
list.set(j, value);
}
}
while (list.contains(value)) {
j = list.indexOf(value);
list.remove(j);
}
System.out.println(list);
System.out.println(step);
}
System.out.println("count=" + list.size());
}
幸运数问题

我是在你的基础上改的,说明见注释。另外建议你循环数直接用for(int i = 0; i < xx; i++)的形式,别把i在外面声明,除非你真的需要在外面用到这个循环数。至于一个变量多个用途就更不可取了……

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;

public class Myjava
{
    public static void main(String[] args)
    {
        int m, n;
        ArrayList<Integer> list = new ArrayList<Integer>();
        Scanner sc = new Scanner(System.in);
        System.out.println("输入m n:");
        m = sc.nextInt();
        n = sc.nextInt();

        //幸运数的起始点是1,而不是m
        for (int i = 1; i <= n / 2; i++)
        {
            list.add(2 * i - 1);
        }

        int step = 1;
        int div;

        while (step < list.size())
        {
            //每次的除数都是上一次删了之后的组数里面的下一个数,第一次是2,第二次是3,删完之后是1,3,7,9,所以第三次是7,因此你每次要取的是
            //剩下来的数组里面的第step个数,特例是2,因为2没能作为幸运数活下来,所以我之前直接先获得一个奇数数组,然后直接从3开始,之后的每一个除数都是幸运数
            div = list.get(step);

            step++;

            for (int j = 0; j < list.size(); j++)
            {
                if ((j + 1) % div == 0)
                {
                    list.set(j, -1);
                }
            }

            //用Iterator来删,不然你每次判断list里面有没有是很浪费时间的
            Iterator<Integer> it = list.iterator();
            while(it.hasNext())
            {
                if (it.next() == -1)
                {
                    it.remove();
                }
            }
            
            System.out.println(list);
            System.out.println(step);
        }
        
        //先获得幸运数数组之后,才能计算个数,只要值是m,n之间的都是你要算进去的数
        int count = 0;
        for (int i = 0; i < list.size(); i++)
        {
            if (list.get(i) > m && list.get(i) < n)
            {
                count++;
            }
            
            if (list.get(i) >= n)
            {
                break;
            }
        }
        
        System.out.println("count=" + count);
    }
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-12-28
你的这个算法本身就是有问题的,你没有理解原题的意思,原题的意思并不是依次去除数组中下标被2,被3,被4…整除的意思,我这么说你能明白吗(不知道我理解的对吗)追问

好吧,能不能把你的理解说一下,谢谢,发到网上就是为了互相讨论的

追答

晚上我在看看,现在正在上课

本回答被网友采纳