【问题标题】:Prime number loop only writes "2" to console. Java [closed]素数循环仅将“2”写入控制台。 Java [关闭]
【发布时间】:2013-05-23 16:47:14
【问题描述】:

我对 Java 或多或少是全新的。我想我会尝试编写一个简单的循环来将 100 以下的素数列表输出到控制台中,作为练习 - 但是您可能可以通过这个问题的标题看出它给出的所有内容都是 2,仅此而已。我正在使用 Eclipse 来编辑和运行我的代码。这里是:

    public class PrimeGen {

        public static void main(String[] args) {

            for (int num = 1,     // number to test
                     testfac = 1, // start factor to divide into num
                     numfacs = 0; // number of factors in current iteration of num
                 num <= 100;
                 num++)
            {
                while (testfac <= num){
                    if (num/testfac == Math.round(num/testfac)) numfacs++; // add 1 to numfacs if it divides evenly
                    testfac++;
                }
                if (numfacs == 2) System.out.println(num);
                numfacs = 0;
                testfac = 1;
            }
        }
    }

如果有人能帮我解决这个问题,我将不胜感激。谢谢!

【问题讨论】:

  • 有数百万个相关问题请搜索!

标签: java eclipse loops numbers primes


【解决方案1】:

if (num/testfac == Math.round(num/testfac)) 替换为if (num % testfac == 0)

问题是Math.round(num/testfac) 将始终等于num/testfac,因为您正在进行整数除法。使用 % 检查可分性。

【讨论】:

  • 太棒了,非常感谢@nitegazer2003! :D 我以后会记得的。
【解决方案2】:

可分性测试

if (num % testfac == 0)

因为每个数字都可以被 1 整除,并且它本身可以通过不检查它们的可除性来节省循环周期。以testfac = 2开头;循环while (testfac &lt; num) 并检查if (numfacs &gt; 0)

【讨论】:

  • 也谢谢你。我试图让程序首先工作并使其尽可能简单。我确实知道每个整数都除以 1,但优化会在以后出现!
  • 是的,我同意你的看法。只是给出一些指示。 (没有冒犯的意思:)
  • 未采取 ;) 这样的优化是否会在工作程序中显着改变速度?
  • 对于给定的素数程序;不,不多。它对循环中正在做什么以及该操作的成本有多高是主观的。但是,在算法分析中,您通常会根据 n 大小的输入所需的步数,使用 Big O(n) 表示法计算解决方案的复杂度。而且,为了使算法尽可能精简,我们付出了巨大的努力。
  • 加载更多的研究让我去做 ;) 再次感谢。
【解决方案3】:

一个更优化的方法是method2。

public static void main(String[] args)
{
    int N = 100000;
    long t1 = System.currentTimeMillis();
    int[] v1 = method1(N);
    long t2 = System.currentTimeMillis();
    int[] v2 = method2(N);
    long t3 = System.currentTimeMillis();

    System.out.println( "m1:"+(t2-t1)+"  m2:"+(t3-t2) );

    int m1=0,m2=0;
    for(int i=0; i<N; i++) if(v1[i]==1) m1++;
    System.out.println();
    for(int i=0; i<N; i++) if(v2[i]==0) m2++;
    assert m1 == m2;
    System.out.println(m1+" == "+m2);

}

public static int[] method1(int N)
{
    int[] vector = new int[N];

    for (int num = 1,     // number to test
            testfac = 1, // start factor to divide into num
            numfacs = 0; // number of factors in current iteration of num
            num <= N;
            num++)
    {
        while (testfac <= num){
            if (num % testfac == 0 ) numfacs++; // add 1 to numfacs if it divides evenly
            testfac++;
        }
        if (numfacs == 2) vector[num]=1;
        numfacs = 0;
        testfac = 1;
    }
    return vector;
}

public static int[] method2(int N)
{
    int[] vector = new int[N];
    vector[0]=1;
    vector[1]=1;

    for(int n=2; n<N/2; n++ )
    {
        if(vector[n]==1)
            continue;
        int m=n;
        for(int i=2; ;i++)
        {
            m = i*n;
            if(m>=N)
                break;
            vector[m]=1;
        }
    }
    return vector;
}

【讨论】:

  • 非常感谢您提供更多信息 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
相关资源
最近更新 更多