素数循环仅写入;2“;安慰。JAVA

素数循环仅写入;2“;安慰。JAVA,java,eclipse,loops,numbers,primes,Java,Eclipse,Loops,Numbers,Primes,我或多或少对Java完全陌生。我想我会尝试编写一个简单的循环,将100以下的素数列表输出到控制台中,作为练习-然而,正如你可能从这个问题的标题可以看出的,它给出的是2,就这样。我正在使用Eclipse编辑和运行我的代码。这是: public class PrimeGen { public static void main(String[] args) { for (int num = 1, // number to test

我或多或少对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;
            }
        }
    }
公共类PrimeGen{
公共静态void main(字符串[]args){
对于(int num=1,//要测试的编号
testfac=1,//要划分为num的起始因子
numfacs=0;//num的当前迭代中的因子数
num将
if(num/testfac==Math.round(num/testfac))
替换为
if(num%testfac==0)


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

测试整除性,如

if (num % testfac == 0)

因为,每个数字都可以被1整除,你可以通过不检查循环周期的整除性来保存循环周期。从
testfac=2
;循环
while(testfac
开始,检查
if(numfacs>0)
方法2更优化一点

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;
}
publicstaticvoidmain(字符串[]args)
{
int N=100000;
long t1=System.currentTimeMillis();
int[]v1=method1(N);
long t2=System.currentTimeMillis();
int[]v2=method2(N);
long t3=System.currentTimeMillis();
系统输出打印项次(“m1:”+(t2-t1)+“m2:”+(t3-t2));
int m1=0,m2=0;

对于(int i=0;有数百万个问题与此相关,请搜索!太棒了,非常感谢@nitegazer2003!:D我以后会记得的。也谢谢你。我试图让程序先工作,并尽可能简单。我确实知道每个整数除以1,但优化会在以后出现!是的,我知道我跟你一起去。只是给点建议。(没有冒犯的意思:)没人接;)这样的优化会使工作程序的速度发生明显的变化吗?对于给定的素数程序,不会,不会太大。这取决于循环中所做的事情以及该操作的成本。但是,在算法分析中,通常用大O(n)来计算解的复杂度基于n大小输入所需的步数的表示法。而且,为了使算法尽可能精简,我们做了大量的工作。接下来我要做更多的研究;)再次感谢。非常感谢您提供更多信息:)