我们都知道素数的特征就是除了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)