素数的定义
素数又叫质数,指的是 大于1的整数中,只能被1和这个数本身整除的数。
方法一:基础遍历
1.第一个for依次枚举出2到n所有数
2.每个数用第二个for进行判断
用数 i 去除以 2
到 i-1
的每个数,一旦整数则break跳出;
注意:
1.j<i 而不是 j<n
2.内层for循环完毕,表示当前的 i 不能被所有 i-1的数整除,属于素数,才添加到 list !所以这里用flag ;
一个 i 对应一个 flag。
List<Integer> list=new ArrayList<>();
for(int i=2;i<=n;i++){ // 依次枚举所有数
// 一个 i 对应一个 flag。
boolean flag=true;
for(int j=2;j<i;j++){ // 每个数进行判断
if(i%j==0){
a=false;
break; // 跳出循环
}
}
// 必须要外层for循环完了再添加到list !
if(flag){ // 假设j能遍历到最后都不被整除
list.add(i);
}
}
或者
这种方法 2会无法进入第二个for,所以将2先添加;
List<Integer> list=new ArrayList<>();
for(int i=2;i<=n;i++){
if(i==2) list.add(i);
for(int j=2;j<i;j++){
if(i%j==0){
break;
}
// 如果j 能遍历到最后都不悲整除
if(j==i-1 && i%j!=0){
list.add(i);
}
}
}
方法二:用sqrt优化
整数的因子一大一小,小的那个因子最大不超过该整数的平方根,
注意 :j < = Math.sqrt(i) , 有等号 !
List<Integer> list=new ArrayList<>();
for(int i=2;i<=n;i++){
boolean a=true;
for(int j=2;j<=Math.sqrt(i);j++){
if(i%j==0){
a=false;
break; // 跳出循环
}
}
if(a){ // 假设j能遍历到最后都不被整除
list.add(i);
}
}
方法三:用list中的素数来充当 j
继续探索,问题转换为判断n能否被[2,sqrt(n)]之间的奇数整除,这些奇数里面的合数是多余的。因为任何一个合数都可以分解为它前面若干个素数的积,若不能被它前面的素数整除,则亦不能被此合数整除。所以整除的范围缩小为[2,sqrt(n)]之间的素数。刚好本题目的目的就是求素数,所以可以将求得的素数放在数组内用来判断。
注意:
- j 索引从 0开始 !
- 此时 j 是索引 !j 不能等于 list.size()
List<Integer> list=new ArrayList<>();
for(int i=2;i<=n;i++){
boolean a=true;
for(int j=2;j<=list.size() && j<=Math.sqrt(i);j++){
if(i%j==0){
a=false;
break;
}
}
if(a){
list.add(i);
}
}