给定一个数字,判定一个数字是否是素数
素数:只能被1或者本身整除的数
用2 -> (n-1)
之中的数字来试除,如果能被除了1和本身的数字整除,就不会有余数,即做%
运算后结果为0。
public static void main(String[] args) {
// 判定素数
// 素数:只能被1或者本身整除的数
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int flag = 1;// 假设是素数
// 开始试除
for (int i = 2; i < n; i++) {
if (n % i == 0) {
flag = 0;// 不是素数
break;
}
}
if (flag == 1 && n != 1) {
System.out.println(n + "是素数");
} else {
System.out.println(n + "不是素数");
}
}
要注意的一点,1也不是素数(可以在百度上查),所以循环之后的if
语句中要加上对1的判断。
打印 1 - 100 之间所有的素数
判读逻辑与上述一样,只不过多了一个循环,需要先生成1-100的数字,同时也可以设定一个计数器,看有多少个素数。
public static void main(String[] args) {
// 生成1-100的数
int count = 0;
for (int i = 1; i <= 100; i++) {
int flag = 1;// 假设是素数
// 开始试除
for (int j = 2; j < i; j++) {
if (i % j == 0) {
flag = 0;// 不是素数
break;
}
}
if (flag == 1 && i != 1) {
count++;
System.out.print(i + " ");
}
}
System.out.println("\ncount = " + count);
}
算法优化
首先,1 不是素数,所以在生成数的循环中可以从 2 开始,并且在flag
判断条件中删除对 1 的判断。
其次,对于一个不是素数的数字来说,它一定可以写成一大一小两个数的乘积,比较特殊的一些数可以正好开平方,因此对数字进行开平方运算,将结果作为循环条件,只要有小的一头数字满足,那另一头大的数字也必然满足,这样做就砍掉了一半需要试除的数,大大提高了运行效率。
public static void main(String[] args) {
// 生成1-100的数
int count = 0;
for (int i = 2; i <= 100; i++) {
int flag = 1;// 是素数
// 开始试除
for (int j = 2; j <= sqrt(i); j++) {
if (i % j == 0) {
flag = 0;// 不是素数
break;
}
}
if (flag == 1) {
count++;
System.out.print(i + " ");
}
}
System.out.println("\ncount = " + count);
}
在Java中,sqrt()
需要导入 java.lang.Math.sqrt;
在C语言中,sqrt
需要用 <math,h>