判断素数
【习题描述】
定义一个判断素数的方法isPrime。用户输入1-100以内的任意数字n,通过调用isPrime方法判断从0-n的所有素数,并打印输出。
import java.util.Scanner;
/*
输入1-100以内的任意数字n,通过for循环输出从0-n中的所有素数,素数只能被1和自身整除。
如:输入:30 输出:2 3 5 7 11 13 17 19 23 29
*/
class Example7_8 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入1-100中的任意数字:");
int j = sc.nextInt();
for (int i = 1; i <= j; i++) {
if (isPrime(i)) {
System.out.print(i+" ");
}
}
}
//素数的判断方法
private static boolean isPrime(int num) {
if(num==1){
return false;
}
//TODO:求出该数值的2次方根,然后判断2到该值之间是否有可以被整除的数,在“- -”处补全代码
long sqrtNum=(long)Math.sqrt(num);
for(- -){
if(- -){
return false;
}
}
return true;
}
}
一开始不明白为什么要开方,后来发现这里涉及到算法。
long sqrtNum=(long)Math.sqrt(num);
首先这条代码会返回num的平方根,如果num不能被整除,则会返回num附近较小的可以被整除的平方根。(这里应该做了一个强制类型转换,将double转成long。)
e.g. 9的平方根是3,输入11输出的也是3。
素数只能被1和本身整除。所以以前我在求素数的时候,大概都是写个for循环,把素数与1到素数本身中间的所有整数都相除,如果余数不为零,就输出这个素数。
为了减少重复量,开平方后面的数就不用相除了,因为如果 m 能被 2 ~ m-1 之间任一整数整除,其二个因子必定有一个小于或等于m的二次方根,另一个大于或等于m的二次方根。那么验证素数时就只需要验证到其平方根就可以了。(减少了除数的范围,被除数还是待验证的整数)
import java.util.Scanner;
/*
输入1-100以内的任意数字n,通过for循环输出从0-n中的所有素数,素数只能被1和自身整除。
如:输入:30 输出:2 3 5 7 11 13 17 19 23 29
*/
class Example7_8 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入1-100中的任意数字:");
int j = sc.nextInt();
for (int i = 1; i <= j; i++) {
if (isPrime(i)) {
System.out.print(i+" ");
}
}
}
//素数的判断方法
private static boolean isPrime(int num) {
if(num==1){
return false;
}
//TODO:求出该数值的2次方根,然后判断2到该值之间是否有可以被整除的数,在“- -”处补全代码
long sqrtNum=(long)Math.sqrt(num);
for(int m=2;m<=sqrtNum;m++){
if(num%m==0){
return false;
}
}
return true;
}
}
C语言判断素数(求素数)(两种方法) (biancheng.net)http://c.biancheng.net/view/498.html