埃氏筛法求素数集
埃拉托色尼算法工作原理:
1.假定范围内的所有的数都是素数
2.我们从2开始,只要是2的倍数我们就认为该数不是素数,打标处理
3.直到判断到n为止我们就可以将所有的非素数打上标记,从而确定了所有的非素数
代码
static void isprim(int a,int b) { //求a与b区间内的素数
for(int i=0;i<=b;i++)isPrim[i]=true;
isPrim[0]=isPrim[1]=false;
int index=0;
for(int i=2;i<=b;i++) {
if(isPrim[i]) {
if(i>=a)
prim[index++]=i;
for(int j=2*i;j<=b;j+=i)
isPrim[j]=false;
}
}
}
素数判断
每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个数的因子,把一个合数用质因子相乘的形式表现出来,叫做分解质因子。
分解质因子只针对合数。
合数:除了1和0以外,可以被1和本身之外的数整除的数
质数(素数):除了1和0以外,只能被1和本身整除的数
// 判断一个数是否为素数
static boolean is_prim(int a) {
for(int i=2;i<=Math.sqrt(a);i++) {
if(a%i==0)
return false;
}
return true;
}
试题 基础练习 分解质因数
思路:先找到最小的质数k,如果k=n,那么就直接输出;如果k<n,那么k/=n,然后继续如此操作
代码
import java.util.Arrays;
import java.util.Scanner;
public class 基础练习_分解质因数 {
static Scanner scanner=new Scanner(System.in);
static int[] arr=new int[20];
static int start=0;
static int a,b;
// 判断一个数是否为素数
static boolean is_prim(int a) {
for(int i=2;i<=Math.sqrt(a);i++) {
if(a%i==0)
return false;
}
return true;
}
// 找到合数的所有质因数
static void solve(int a) {
Arrays.fill(arr, 0); // 初始化最小质因数数组全为0
start=0; // 初始化起始位置
while(a!=1) {
for(int i=2;i<=a;i++) {
if(a%i==0&&is_prim(i)) {
arr[start++]=i;
a/=i;
break;
}
}
}
}
public static void main(String[] args) {
a=scanner.nextInt();
b=scanner.nextInt();
for(int i=a;i<=b;i++) {
if(is_prim(i)) {
System.out.println(i+"="+i);
}else {
solve(i);
System.out.print(i+"=");
for(int j=0;j<start;j++) {
if(j==0) {
System.out.print(arr[j]);
}else {
System.out.print("*"+arr[j]);
}
}
System.out.println();
}
}
}
}
学习参考:
https://blog.csdn.net/ltyqljhwcm/article/details/52835805 埃拉托色尼素数筛法
https://blog.csdn.net/qq_43721152/article/details/104617811 解题思路