java—我正在尝试编写一个代码来检查2到1000之间的数字是否是素数

rt4zxlrg  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(246)
import java.util.Scanner;

public class Main {

  public static void main(String[] args) {

    for(int j = 2; j<=1000; j++) {
        boolean yes = true;
        for(int i = 2; i<j && yes== true; i++){
            if(j%i==0) {
                yes=false;
            }
        System.out.println(j + ":" + yes); 
      } 
    }  
  }
}

到目前为止,我一直在试图弄清楚问题出在哪里,但没有任何答案。

fv2wmkja

fv2wmkja1#

或者,可以使用流来完成您正在尝试执行的操作:

IntStream.range(2, 1001)
         .boxed()
         .filter(j -> IntStream.range(2, j).boxed().allMatch(i -> j % i != 0))
         .forEach(System.out::println);

首先生成一个从2到1000(含)的索引,即:。, IntStream.range(2, 1001) ,将intstream转换为整数(即。, boxed() ),则只过滤那些素数 .filter(j -> IntStream.range(2, j).boxed().allMatch(i -> j % i != 0)) ,最后将结果打印出来。
使用这种管道,就不太可能出现您在原始代码中所犯的错误。

0sgqnhkj

0sgqnhkj2#

你得走了 System.out.println(j + ":" + yes); 在内环外。之所以需要将其移出,是因为只有在内部循环完成之后,才能决定数字是否为素数。

public class Main {
    public static void main(String[] args) {
        for (int j = 2; j <= 1000; j++) {
            boolean yes = true;
            for (int i = 2; i < j && yes == true; i++) {
                if (j % i == 0) {
                    yes = false;
                }
            }
            if (yes) {
                System.out.println(j + ":" + yes);
            }
        }
    }
}

旁注:您不需要检查 i < j . 可能是的 i <= Math.sqrt(j) . 检查https://en.wikipedia.org/wiki/primality_test 了解更多。
另外,如果要打印 false 另外,不要使用 if (yes) {} 阻止。

public class Main {
    public static void main(String[] args) {
        for (int j = 2; j <= 1000; j++) {
            boolean yes = true;
            for (int i = 2, n = (int) Math.sqrt(j); i <= n && yes == true; i++) {
                if (j % i == 0) {
                    yes = false;
                }
            }

            System.out.println(j + ":" + yes);

        }
    }
}

相关问题