import java.util.Scanner;
//埃拉托色尼质数筛选法
public class sieveofEratosthenes {
static final boolean DEBUG = true;
//输入:一个整数n(n大于1)
//输出小于等于n的质数的数组L
public static int[] getPrime(int n){
int p = (int) Math.sqrt(n);//遍历的最大界限
int result[] = new int[n+1];//质数集
int temp[] = new int[n+1];//待存数组
//初始化待存数组
for(int i=2;i<=n;i++){
temp[i]=i;
}
int j=0;
for(int i=2;i<=p;i++){
if(temp[i] != 0){
j=i*i;//出发点
while(j<=n){//终止点
temp[j] = 0;//消去该元素
j=j+i;//i的2倍、3倍、4倍。。。的遍历
}
}
}
//将待存数组赋值到result中
int len = 0;
for(int i=2;i<=n;i++){
if(temp[i] != 0){
result[len++] = i;
}
}
int L[] = new int[len];
for(int i=0;i<len;i++){
L[i] = result[i];
if(DEBUG){
if(i == 0){
System.out.print("PrimeList of " + n + ":" + L[i]);
}else {
System.out.print(" "+ L[i]);
}
}
if(i == len-1){
System.out.print("\n");
}
}
return L;
}
//求整数的所有质因数
public static int[] getNPrime(int n) {
int Nprime[] = new int[n+1];
int primelist[] = getPrime(n);
int len = 0; //返回结果集数组长度,初始化为0
for(int i = 0;i < primelist.length;i++){
int temp = n;
while(temp % primelist[i] == 0){
temp = temp/primelist[i];
Nprime[len++] =primelist[i];
}
}
int result[] = new int[len];
for (int i = 0; i < len; i++) {
result[i] = Nprime[i];
if(DEBUG){
if(i == 0){
System.out.print(n + "=" + result[i]);
}else {
System.out.print("x" + result[i]);
}
if(i == len-1){
System.out.print("\n");
}
}
}
return result;
}
//求两个整数的公共质数
public static int[] getCommomNPrime(int[] A,int[] B){
int C[] = new int[A.length+B.length];
int ai=0,bi=0,ci=0;
while(ai<A.length && bi<B.length){
if(A[ai] == B[bi]){
C[ci++] = A[ai];
ai++;
bi++;
}else if(A[ai] < B[bi]){
ai++;
}else {
bi++;
}
}
int M[] = new int[ci];
for(int i=0;i<ci;i++){
M[i] = C[i];
if(DEBUG){
if(i == 0){
System.out.print("CommomPrime of n,m:" + M[i]);
}else {
System.out.print(" "+ M[i]);
}
if(i == ci-1){
System.out.print("\n");
}
}
}
return M;
}
//求两个整数的最大公因数
public static int getMaxCommom(int[] M) {
int max = 1;
for(int i=0;i<M.length;i++){
max *= M[i];
}
return max;
}
public static void main(String[] args){
int n,m;
Scanner sc = new Scanner(System.in);
while(true){
//输入
System.out.print("input integer n(0 is end):");
n = sc.nextInt();
if(n == 0){
System.out.print("end!\n");
break;
}
System.out.print("input integer m:");
m = sc.nextInt();
//输出
int a[] = sieveofEratosthenes.getNPrime(n);
int b[] = sieveofEratosthenes.getNPrime(m);
int com[] = sieveofEratosthenes.getCommomNPrime(a, b);
System.out.print("MaxCommon:"+ sieveofEratosthenes.getMaxCommom(com) + "\n");
}
}
}
基于埃拉托色尼质数筛选法求最大公因数(java)
最新推荐文章于 2023-03-04 15:22:54 发布