素数:素数判断、找素数、计算素数和、素数求和

有关素数的基础算法

素数测试

在这里插入图片描述
在这里插入图片描述

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均为小写。

发布了342 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44522477/article/details/105221528