所以我在java中编写了这段代码,它应该在屏幕上输出从1到n的数字(由用户给出),它应该写出#34; -prime"靠近那些最好的。
import java.util.Scanner;
public class primeMass {
public static void main(String args[])
{
Scanner sc = new Scanner(System.in);
int n;
int i,j;
System.out.print("Dati n: ");
n = sc.nextInt();
for(i=1;i<=n;i++)
for(j=2;j<=n/2;j++)
{
if(i%j==0)
System.out.println(i);
else System.out.println(i +"-prime");
}}
}
如果我输入6例如我得到:
Dati n: 6
1-prime
1-prime
2
2-prime
3-prime
3
4
4-prime
5-prime
5-prime
6
6
我对此很陌生,而且我真的在努力学习算法,你能不能告诉我如何更改我的程序以便输出正确的值,并向我解释我做错了什么?谢谢
更新:
我已经完成了,谢谢大家帮助我:这就是结果:
import java.util.Scanner; 公共类primeMass {
public static void main(String args[])
{
Scanner sc = new Scanner(System.in);
int n;
int i,j;
boolean gasit = false;
System.out.print("Dati n: ");
n = sc.nextInt();
for(i=1;i<=n;i++) {
gasit=false;
for(j=2;j*j<=i;j++)
{
if(i%j==0) gasit=true;}
if(!gasit) {System.out.println(i+"-prime");}
else {
System.out.println(i);}
}
}
}
答案 0 :(得分:1)
在内循环的每次迭代中打印一些东西。
相反,您应该在所有迭代完成后打印,例如
(string key, MyObject myObject) = fooDictionary.Where(x => !x.Value.Boo).ExtensionMethod();
此外,你不应该进入boolean found = false;
for(j=2;j<=n/2;j++) {
if(i%j==0) found = true;
}
if (!found) {
System.out.println(i + "-prime");
} else {
System.out.println(i);
}
:你可能意味着n/2
(一个数字没有比自身更大的因素);但是你可以使它更紧凑,因为你不必检查大于i/2
的因子。或者,换句话说,sqrt(i)
。
所以你可以进行循环声明:
j * j <= i
答案 1 :(得分:0)
问题是第二个循环一直持续到n/2
,它应该到i/2
以检查i
是否为素数。正如评论中所建议的那样,素数检查算法的更优化版本将持续到sqrt(i)
。
下一个问题是你以错误的方式得出结论,如果在第一种情况下if(i%j==0)
你说不是素数,否则你说它是素数,这不是必须的。您应该在[2:i/2]
之间迭代整个值间隔,以得出i
为素数的结论。