Java 素数测试总是返回true
所以我刚刚启动了一些java,我试图让用户输入一个数字,并测试它是否为素数。这是我为这个节目做的循环Java 素数测试总是返回true,java,primes,Java,Primes,所以我刚刚启动了一些java,我试图让用户输入一个数字,并测试它是否为素数。这是我为这个节目做的循环 do{ for(testNumber = 2; testNumber < numb; testNumber++){ if(numb % testNumber == 0){ test = false; }else{ test = true;
do{
for(testNumber = 2; testNumber < numb; testNumber++){
if(numb % testNumber == 0){
test = false;
}else{
test = true;
}
}
if(test = true){
System.out.println("The number is prime.");
}else{
System.out.println("The number is not prime.");
}
System.out.println("Enter a number. Enter 0 to exit.");
numb = number.nextInt();
}while(numb != 0);
do{
for(testNumber=2;testNumber
输入的每个数字都是真的!在我看来,这个逻辑似乎是正确的。如果你找到了它,并且如果条件==true,你应该打破它
do{
for(testNumber = 2; testNumber < numb; testNumber++){
if(numb % testNumber == 0){
test = false;
break;
}else{
test = true;
}
}
if(test == true){
System.out.println("The number is prime.");
}else{
System.out.println("The number is not prime.");
}
System.out.println("Enter a number. Enter 0 to exit.");
numb = number.nextInt();
}while(numb != 0);
do{
for(testNumber=2;testNumber
首先,您使用赋值运算符=
将测试
与真
进行比较,这会导致测试
始终为真
。它已经是一个布尔值
,只需使用它,而不需要进行额外的比较:
if(test){
其次,您正在为循环迭代在每个中覆盖test
的值。将其初始化为true
,并且仅在找到因子时才将其设置为false
test = true;
for(testNumber = 2; testNumber < numb; testNumber++){
if(numb % testNumber == 0){
test = false;
}
}
应该是
if(test == true){
第一个是“”运算符,第二个是逻辑(相等测试)运算符。请阅读更多关于
注
我不是在评论代码的其他部分,作为您的学习练习。您的代码可以优化和改进!你在正确的轨道上。坚持下去 您有两个问题。首先,考虑您的循环逻辑:您在循环的每次传递上都积极地设置test
变量。由于循环结束于numb-1
,因此它几乎总是在最后一次通过时将test
设置为true
。相反,在循环之前将test
设置为true
,如果找到一个因子,则仅将其设置为false
:一旦检测到它不是prime,就会将其保留为false
。(将该循环放在一个单独的方法中,这样您就可以立即返回
,这样做会更好。)
isPrime=true;
对于(int-factor=2;factor
其次,在if
语句中设置test
。您必须使用==
来检查是否相等,在Java中,只使用if(test)
更为惯用
就样式而言,名为test
的变量不太具有描述性。我建议使用我上面使用的isPrime
名称
最后,您只需要检查testNumber
的平方根,但不要使用浮点运算,然后截断结果,否则可能会丢失精确的平方根因子。这个问题已经被问了很多次了。。。寻找一个素数生成器并从中学习。一些建议:如果你想让它更快,设置你的循环,这样你就不会测试偶数,你只会测试到numb/2取整。西方最快的枪是多少?:)您可能需要(int)Math.ceil(Math.sqrt(numb))
。永远不知道什么时候你会有一个无穷小的底流并截断一个.9999999999
。谢谢,删除“=true”是有效的。似乎不起作用?我输入4,但程序仍将其打印为素数。您在我编辑条件后尝试过吗?休息会让你的节目更快捷,我补充说休息;测试后=假;但是它仍然显示4是素数。如果(test==true)不是如果(test=true)这是编辑哦,对不起,没有看到。是的,成功了。谢谢。仅供参考,我不认为截断Math.sqrt
的结果对于int
来说是个问题,因为int
是32位,double
有52位尾数。我刚刚运行了一个测试,我不认为有任何int
会失败<代码>长
可能是个问题。
if(test = true){
if(test == true){
isPrime = true;
for(int factor = 2; factor < numb; factor++) { // see below for advice on condition
if(numb % factor == 0)
isPrime = false;
}