我或多或少都是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;
}
}
}
如果有人能帮助我,我将非常感激。谢谢!
答案 0 :(得分:1)
将if (num/testfac == Math.round(num/testfac))
替换为if (num % testfac == 0)
。
问题是Math.round(num/testfac)
总是等于num/testfac
,因为你正在进行整数除法。使用%来检查可分性。
答案 1 :(得分:0)
测试可分性,如
if (num % testfac == 0)
因为,每个数字都可以被1整除,并且你可以通过不检查它们的可分性来保存你的循环周期。从testfac = 2
开始;循环while (testfac < num)
并检查if (numfacs > 0)
。
答案 2 :(得分: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;
}