有关素数的基础算法
素数测试
package 素数;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class 素数的判定 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
long n=sc.nextLong();
if(is_prime(n))
System.out.println("yes");
else
System.out.println("no");
System.out.println(disvisor(n));
}
//素数测试
public static boolean is_prime(long n){
for(int i=2;i*i<=n;i++){
if(n%i==0)
return false;
}
return n!=1;//1是一个例外
}
//约束枚举
public static ArrayList<Long> disvisor(long n){
ArrayList<Long> res=new ArrayList<>();
for(long i=1;i*i<=n;i++){
if(n%i==0){
res.add(i);
if(i!=n/i)
res.add(n/i);
}
}
return res;
}
//这个我还是没有弄懂
//整数分解
public static Map<Integer,Integer> prime_factor(int n){
Map<Integer,Integer>res=new HashMap<>();
for(int i=2;i*i<=n;i++){
while(n%i==0){
res.put(n/i,i++);
}
}
if(n!=1)
res.put(n,1);
return res;
}
}
埃氏筛法
代码
package 素数;
import java.util.Scanner;
public class 素数的个数 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] prime=new int[n];//第i个素数
boolean[] is_prime=new boolean[n+1];//is_prime[i]位true表示i是素数
//返回n以内的素数的个数
int p=0;
for(int i=0;i<=n;i++)
is_prime[i]=true;
is_prime[0]=is_prime[1]=true;
for(int i=2;i<=n;i++){
if(is_prime[i]){
prime[p++]=i;//prime[0]=i,p++
for(int j=2*i;j<=n;j+=i)
is_prime[j]=false;
}
}
System.out.println(p);
//for(int i=0;i<n;i++)
//System.out.println(prime[i]);
}
}
区间筛法
有小问题的代码
package 素数;
import java.util.Scanner;
public class 区间内素数的个数 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
int b=sc.nextInt();
boolean[] is_prime=new boolean[1000005];//is_prime[i]位true表示i是素数
int bb=(int)Math.sqrt(b);
boolean[] is_prime_small=new boolean[46350];
//对区间[a,b)内的整数执行筛法,is_prime[i-a]=true等价于i是素数
for(int i=0;i<bb;i++){
is_prime_small[i]=true;
}
//题目给的范围太大,根本不可能开出那么大的数组,所以用r-l来存储
for(int i=0;i<b-a;i++){
is_prime[i]=true;
}
for(int i=2;i<bb;i++){
if(is_prime_small[i]){
for(int j=2*i;j<bb;j+=i)
is_prime_small[j]=false;//筛选2,根号b
for(int j=(int) (Math.max(2l,(a+i-1)/i)*i);j<b;j+=i)
is_prime[j-a]=false;//筛选a,b
}
}
int cnt = 0;
for(int i=a;i<=b;i++){
if(is_prime[i-a])
cnt++;
}
System.out.println(cnt);
}
}
代码(都不是很好,因为我不知道C++里面的LONG转换到java里面,怎么才能使它不溢出)
package 素数;
import java.util.ArrayList;
import java.util.Scanner;
public class 区间内素数的个数1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
int n=sc.nextInt();
//int[] prime=new int[n];//第i个素数
ArrayList<Integer> prime=new ArrayList<>();
boolean[] is_prime=new boolean[n+1];//is_prime[i]位true表示i是素数
//返回n以内的素数的个数
int p=0;
for(int i=0;i<=n;i++)
is_prime[i]=true;
is_prime[0]=is_prime[1]=true;
for(int i=2;i<=n;i++){
if(is_prime[i]){
prime.add(i);
p++;
//prime[p++]=i;//prime[0]=i,p++
for(int j=2*i;j<=n;j+=i)
is_prime[j]=false;
}
}
for(int i=0;i<prime.size();i++){
if(prime.get(i)<a){
p--;
}else
break;
}
if(prime.get(prime.size()-1)==n)
p--;
System.out.println(p);
}
}
素数求和
题目
问题描述
输入一个自然数n,求小于等于n的素数之和
样例输入
2
样例输出
2
数据规模和约定
测试样例保证 2 <= n <= 2,000,000
package 素数;
import java.util.ArrayList;
import java.util.Scanner;
public class 素数求和 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
ArrayList<Integer> prime=new ArrayList<>();
boolean[] is_prime=new boolean[n+1];
for(int i=0;i<=n;i++)
is_prime[i]=true;
is_prime[0]=is_prime[1]=true;
for(int i=2;i<=n;i++){
if(is_prime[i]){
prime.add(i);
for(int j=2*i;j<=n;j+=i){
is_prime[j]=false;
}
}
}
long sum=0;
for(int i=0;i<prime.size();i++){
sum+=prime.get(i);
}
System.out.println(sum);
}
}
计算素数和
题目
问题描述
完成一个程序,该程序计算n以内(包含n)的所有素数之和并返回。注意,提交完整的程序代码。
输入格式
输入一个整数 n;
输出格式
输出n以前所有素数的和。
样例输入
5
样例输出
10
代码
package 素数;
import java.util.ArrayList;
import java.util.Scanner;
public class 计算素数和 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
ArrayList<Integer> prime=new ArrayList<>();
boolean[] is_prime=new boolean[n+1];
for(int i=0;i<=n;i++)
is_prime[i]=true;
is_prime[0]=is_prime[1]=true;
for(int i=2;i<=n;i++){
if(is_prime[i]){
prime.add(i);
for(int j=2*i;j<=n;j+=i)
is_prime[j]=false;
}
}
long sum=0;
for(int i=0;i<prime.size();i++){
sum+=prime.get(i);
}
System.out.println(sum);
}
}
找素数
题目
问题描述
给定区间[L, R] , 请计算区间中素数的个数。
输入格式
两个数L和R。
输出格式
一行,区间中素数的个数。
样例输入
2 11
样例输出
5
数据规模和约定
2 <= L <= R <= 2147483647 R-L <= 1000000
代码
package 素数;
import java.util.ArrayList;
import java.util.Scanner;
public class 找素数 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
long a=sc.nextLong();
long b=sc.nextLong();
ArrayList<Integer> prime=new ArrayList<>();
boolean[] is_prime=new boolean[2147483647];
int p=0;
for(int i=0;i<b;i++)
is_prime[i]=true;
is_prime[0]=true;
for(int i=1;i<b;i++){
if(is_prime[i]){
prime.add(i+1);
p++;
for(int j=2*i-1;j<b;j+=i)
is_prime[j]=false;
}
}
for(int i=0;i<prime.size();i++){
if(prime.get(i)<a)
p--;
else
break;
}
System.out.println(p);
}
}
素数判断
题目
编写一函数IsPrime,判断某个大于2的正整数是否为素数。
样例输入: 5样例输出:yes
样例输入: 9样例输出:no
注意:是素数输出yes,不是素数输出no,其中yes和no均为小写。