判断101-200之间有多少个素数,并输出所有素数
问题分析:题目中的关键词是素数,什么是素数?素数就是只能被1和自身整除的数,例如11就是素数,但12就不是,因为12可以被1,2,3,4,6和12整除,故12就不是素数;但11就只能被1和11整除,所以11就是素数。
解决办法:判断素数的经典方法如下是用一个数分别去除2到sqrt(这个数),如果能被整除,
则表明此数不是素数,反之则是素数。
方法一 根据基本概念编码
这里提供一个最基础版的解题代码,直接根据概念编码。
/**
* 素数就是只能被1和自身整除的数
*/
public static void baseSolution() {
int i = 0, count = 0;
for (i = 101; i <= 200; i++) {
if (isPrime(i)) {
count++;
}
}
System.out.println("素数的个数是:" + count);
}
/**
* 判断一个数是否为素数
*
* @param x 待判定的数
* @return true 是素数
*/
public static Boolean isPrime(int x) {
int s = 0, n;
for (n = 1; n <= x; n++) {
if (x % n == 0) {
s++;
}
}
// s > 2说明被1和本身外的数整除
if (s == 2) {
// 打印素数
System.out.println(x);
return Boolean.TRUE;
}
return Boolean.FALSE;
}
方法二 根据平方根求余数
记end的平方根的上整数为sqrtEnd,根据数学原理,我们知道只要在[begin, sqrtEnd]中不存在可以整除end的数,则end也为素数。故根据此原理编写了如下求解源码:
/**
* 查找 m和n之间的素数
*
* @param begin
* @param end 小于begin时,提示无素数
*/
private static void sqrtSolution(Integer begin, Integer end) {
// 更新步长减少遍历次数
int len = 1;
if (begin % 2 == 1) {
len = 2;
}
int i = 0, count = 0;
for (i = begin; i <= end; i += len) {
if (isPrimeSqrt(i)) {
count++;
}
}
System.out.println("sqrtSolution 找到的素数个数是:" + count);
}
private static boolean isPrimeSqrt(int x) {
double max = Math.sqrt(x);
boolean b = false;
for (int j = 2; j <= max; j++) {
if (x % j == 0) {
b = Boolean.FALSE;
break;
} else {
b = Boolean.TRUE;
}
}
if (b) {
System.out.println(x);
return b;
}
return Boolean.FALSE;
}
测试方法就是一个main 函数:
public static void main(String[] args) {
baseSolution();
sqrtSolution(101, 200);
}
读后有收获,小礼物走一走,请作者喝咖啡。
Buy me a coffee. ☕Get red packets.
作者:楼兰胡杨
本文版权归作者和博客园共有,欢迎转载,但请注明原文链接,并保留此段声明,否则保留追究法律责任的权利。