说明:除了1和它本身以外,不能被其他数字整除的数,就叫素数。
实现:
- 定义了flag标记位
- 遍历 2 到 该数-1 去判断是否有整除的数据,有则改变flag标记位的状态。
- 最终通过flag的状态判断是否是素数。
- 升级:2 到 该数的一半
- 原因:2是最小数 它的对面即是最大数,遍历的后面一半即是翻转
- 例如:
- 16/2=8
- 16/3=5......1
- 16/4=4
- 16/5=3.......1
- 16/6=2........4
- 16/7=2........2 只需要遍历到这里即可,下面是重复数字的翻转
- 16/8=2 翻转第一行
- 再升级:2 到 该数的开方
- 如果一个数字a能被整除,即a/x=y;即a=xy; 那么x、y中的一个必定小于a的开方
- 仔细看上述示例,其实在16/4=4亦是一个分界点
- 证明: 是一个a倍的 它是一个反比例函数,其对称轴是y=x和y=-x。
- 它实际上是一个矩形面积,其相乘=16,拖动x就是在规划矩形,即遍历2到该数-1。而又是关于y=x轴对称,所以带入公式 即 ,那么整个矩形会在这个点(正方形时)进行翻转。
以下是java代码(开方版)
import java.util.Scanner;
//素数 找出101——200有多少个素数 21
public class Test7 {
public static void main(String[] args) {
int start;
int end;
Scanner sc=new Scanner(System.in);
start=sc.nextInt();
end=sc.nextInt();
search(start,end);
}
public static void search(int start, int end) {
int count=0;
while(start!=end){
boolean flag=true;
for(int i=2;i<=Math.sqrt(start);i++){
if(start%i==0){
flag=false;
}
}
if(flag==true){
System.out.println(start);
count++;
}
start++;
}
System.out.println("此区间内的素数个数是:"+count);
}
}
ps:第一次写,主要目的是记录下开方证明的灵感。如有错误欠缺之处还请见谅,或者各位大神有更清晰的证明,欢迎在评论区指正交流谢谢。