素数、孪生素数、素数环问题

        我们都知道素数的特征就是除了1和自身,它没有其他约数了,素数的编码也被很多初学者拿来练手,今天就针对素数的几个延伸例题进行整理,欢迎补充^-^

素数

      这里列出几种求素数的方法。  

第一种:常规方法 (从2到(x-1)是否可以被整除)

package text;

import java.util.Scanner;

public class Prime {
	public static void main(String[] args) {
		System.out.println("你想知道1到多少的素数:");
		Scanner in = new Scanner(System.in);
		int x;
		x = in.nextInt();
		boolean isprime = true;

		for (int i = 2; i <= x; i++) {
			for (int j = 2; j < i; j++) {
				if (i % j == 0) {
					isprime = false;
					break;
				}
			}
			if (isprime)
				System.out.print(i + " ");
			isprime = true;
		}
	}
}

 

第二种:改进方法( ①去偶数 ②从3开始每次加2是否可以被整除    大约一共需要计算n/2次  )

package test;

import java.util.Scanner;

public class Prime2 {
	public static void main(String[] args) {
		System.out.println("你想知道1到多少的素数:");
		Scanner in = new Scanner(System.in);
		int x;
		x = in.nextInt();
		boolean isprime = true;

		for (int i = 1; i <= x; i++) {
			// 1和偶数便可以不必再往下走
			if (i == 1 || (i % 2 == 0 && i != 2))
				continue;
			for (int j = 3; j < i; j += 2) {
				// 如果是2则不进入子循环
				if (i % j == 0) {
					isprime = false;
					break;
				}
			}
			if (isprime) {
				System.out.print(i + " ");
			}
			isprime = true;
		}
	}
}

 

第三种:改进方法(每个数只要除到sqrtx 即可 )

package test;

import java.util.Scanner;

public class Prime3 {
	public static void main(String[] args) {
        System.out.println("你想知道1到多少的素数:");
		Scanner in = new Scanner(System.in);
		int x;
		x = in.nextInt();
		boolean isprime = true;

		for (int i = 1; i <= x; i++) {
			if (i == 1 || (i % 2 == 0 && i != 2))
				continue;
			for (int j = 3; j <= Math.sqrt(i); j += 2) {
				if (i % j == 0) {
					isprime = false;
					break;
				}
			}
			if (isprime)
				System.out.print(i + " ");
			isprime = true;
		}
	}
}

 

第四种:改进方法(判断是否可以被<x的素数整除 )

package test;

import java.util.Scanner;

public class Prime4 {
	public static void main(String[] args) {
		System.out.println("你想知道1到多少的素数:");
		Scanner in = new Scanner(System.in);
		int x;
		x = in.nextInt();
		int[] prime = new int[100];
		int cnt = 1;
		prime[0] = 2;
		boolean isprime = true;

		for (int i = 3; i <= x; i += 2) {
			for (int j = 0; j < cnt; j++) {
				if (i % prime[j] == 0) {
					isprime = false;
					break;
				}
			}
			if (isprime)
				prime[cnt++] = i;
			isprime = true;
		}

		for (int k = 0; k < cnt; k++) {
			System.out.print(prime[k] + " ");
		}
	}
}

 

建议使用第三种和第四种。 

孪生素数

        若两个素数之差为2 则这两个素数就是孪生素数。编写程序找出指定数之间的所有孪生素数。

package test;

import java.util.Scanner;

public class TwinPrimeNumber {
	private static Scanner scanner;

	static {
		scanner = new Scanner(System.in);
	}

	public static void main(String[] Args) {
		System.out.println("请输入指定的最小数:");
		int N = scanner.nextInt();
		System.out.println("请输入指定的最大数:");
		int M = scanner.nextInt();
		int[] a = new int[M - N];
		int n = 0;
		// 将(M-N)以内的素数存入数组
		for (int i = N; i <= M; i++) { 
			int flag = 1;
			for (int j = 2; j < i; j++) {
				if (i % j == 0) {
					flag = 0;
				}
			}
			if (flag == 1) {
				a[n] = i;
				n++;
			}
		}

		// 输出数组中相邻元素差为2的两个元素
		for (int i = 0; i < n - 2; i++) { 
			if (a[i + 1] - a[i] == 2) {
				System.out.print(a[i] + " " + a[i + 1]);
				System.out.println();
			}
		}
	}
}

 

算法竞赛之孪生素数题

        输入m,输出2个数均不超过m的最大孪生素数。例如m=20时,答案是17,19;m=1000时,答案是881和883。

java源码:

package test;

import java.util.Scanner;

public class MaxTwinPrime {
	public static void main(String[]args) {
		System.out.println("请输入一个大于5整数:");
		int m=new Scanner(System.in).nextInt();
		//最小的孪生素数是3和5,所以输入的数需要大于5才成立
		for(int i=m-2;i>=3;i--){
			if(isPrime(i)&&isPrime(i+2)) {
				System.out.println("不超过"+m+"的孪生素数为:"+i+"和"+(i+2));
				break;
			}
		}
	}
	private static boolean isPrime(int n) {
		//从2开始,如果这个数除了它本身还有约数,则不是素数
		for(int i=2;i*i<n;i++) {
			if(n%i==0){
				return false;
				}
			}
		return true;
	}
}

素数环问题

       输入正整数n,把整数1,2,3,…n组成一个环,使得相邻两个整数之和均为素数。输出时从整数1开始逆时针排列。同一个环应恰好输出一次。(素数环问题之前在整理《回溯算法》的时候就整理出来了,源码在https://blog.csdn.net/Marmara01/article/details/84727406) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值