1 问题描述
Compute the Greatest Common Divisor of Two Integers using Sieve of Eratosthenes.

翻译:使用埃拉托色尼筛选法计算两个整数的最大公约数。(PS:最大公约数也称最大公因数,指两个或多个整数共有约数中最大的一个)

2 解决方案
2.1 埃拉托色尼筛选法原理简介
引用自百度百科:

埃拉托色尼筛选法(the Sieve of Eratosthenes)简称埃氏筛法,是古希腊数学家埃拉托色尼(Eratosthenes 274B.C.~194B.C.)提出的一种筛选法。 是针对自然数列中的自然数而实施的,用于求一定范围内的质数,它的容斥原理之完备性条件是p=H~。

具体求取质数的思想:

(1)先把1删除(现今数学界1既不是质数也不是合数)

(2)读取队列中当前最小的数2,然后把2的倍数删去

(3)读取队列中当前最小的数3,然后把3的倍数删去

(4)读取队列中当前最小的数5,然后把5的倍数删去

(5)如上所述直到需求的范围内所有的数均删除或读取

下面看一下执行上述步骤求不大于100的所有质数的一个示意图:

2.2 具体编码
本文求取两个数的最大公约数,采用质因数分解法:把每个数分别分解质因数,再把各数中的全部公有质因数提取出来连乘,所得的积就是这几个数的最大公约数。

例如:求24和60的最大公约数,先分解质因数,得24=2×2×2×3,60=2×2×3×5,24与60的全部公有的质因数是2、2、3,它们的积是2×2×3=12,所以,(24,60)=12。

此处,第一步,先使用埃拉托色尼筛选法求取不大于数A的所有质数,然后从这些质数中选取A的所有质因数;第二步,依照第一步思想求取数B的所有质因数;第三步,求取数A和数B公共质因数;第四步,输出数A和数B的最大公约数。

具体代码如下:

package com.liuzhen.ex1;import java.util.Scanner;public class SieveOfEratosthenes {//返回一维数组,数组中的元素为不大于n的所有质数public static int[] getPrime(int n){int[] result1 = new int[n];   //定义一个一维数组,并从第2个元素依次初始化为相应的自然数for(int i = 2;i < n+1;i++){    result1[i-1] = i;}for(int i = 2;i < n;i++){for(int j = i+1;j < n+1;j++){if(j % i == 0)          //如果j能够整除i,使result[j-1]等于0result1[j-1] = 0;}}int[] result2 = getNoneZero(result1);  //除去result数组中所有0元素return result2;     //数组中非零元素即为不大于n的所有质数}//返回一维数组,该数组的元素为参数数组中所有不为0的元素值public static int[] getNoneZero(int[] A){int len = 0; for(int i = 0;i < A.length;i++){if(A[i] != 0)len = len+1;}int[] result = new int[len];int k = 0;for(int i = 0;i < A.length;i++){if(A[i] != 0){result[k] = A[i];k++;}}return result;}//求取一个数n的所有质因数(eg:24=2×2×2×3,则result[] = {2,2,2,3})public static int[] getNprime(int n){int[] primes = getPrime(n);int[] result;        //最终返回结果集int len = 0;         //返回结果集数组长度,初始化为0for(int i = 0;i < primes.length;i++){int temp = n;while(temp % primes[i] == 0){temp = temp/primes[i];len++;}}result = new int[len];int k = 0;for(int i = 0;i < primes.length;i++){int temp = n;while(temp % primes[i] == 0){temp = temp/primes[i];result[k] = primes[i];k++;}}return result;}//返回两个一维数组中所有共同元素public static int[] getCommonPrime(int[] A , int[] B){int[] result;int lenA = A.length;int lenB = B.length;if(lenA < lenB){result = new int[lenA];for(int i = 0;i < lenA;i++){int temp = A[i];for(int j = 0;j < lenB;j++){if(temp == B[j]){result[i] = A[i];B[j] = 0;break;}}}}else{result = new int[lenB];for(int i = 0;i < lenB;i++){int temp = B[i];for(int j = 0;j < lenA;j++){if(temp == A[j]){result[i] = B[i];A[j] = 0;break;}}}}int[] result1 = getNoneZero(result);return result1;}//求取数A和B的最大公约数public static void getMaxCommonDivisor(int A,int B){int[] primesA =  getNprime(A);  //数A所有质因子int[] primesB = getNprime(B);   //数B所有质因子int[] resultPrime = getCommonPrime(primesA,primesB);  //数A和数B的公共质因数int maxCommonDivisor = 1;System.out.println(A+"和"+B+"的公共质因数为:");for(int i = 0;i < resultPrime.length;i++){maxCommonDivisor *= resultPrime[i];System.out.print(resultPrime[i]+"\t");}System.out.println();System.out.print(A+"和"+B+"的最大公约数为:"+maxCommonDivisor);}public static void main(String[] args){System.out.println("请输入数字A和数字B的值:");Scanner in = new Scanner(System.in);int a = in.nextInt();int b = in.nextInt();getMaxCommonDivisor(a,b);}
}

运行结果:

请输入数字A和数字B的值:
60
100和60的公共质因数为:2    5
100和60的最大公约数为:20请输入数字A和数字B的值:
48
60和48的公共质因数为:2    3
60和48的最大公约数为:12请输入数字A和数字B的值:
54
120和54的公共质因数为:3
120和54的最大公约数为:6

Java实现埃拉托色尼筛选法相关推荐

  1. Java 埃拉托色尼筛选法

    埃拉托色尼筛选法 埃拉托色尼筛选法 概念 步骤 优化 代码 埃拉托色尼筛选法 概念 埃拉托色尼筛选法(the Sieve of Eratosthenes)简称埃氏筛法,是古希腊数学家埃拉托色尼提出的一 ...

  2. 埃拉托色尼筛选法(Eratosthenes Sieve)分析

    最近看<java核心技术>看到集合章节,在最后位集(BitSet)部分给出了一个示例程序,使用了埃拉托色尼筛选法(Eratosthenes Sieve)求自然数2~n范围的所有素数 代码如 ...

  3. JavaScript实现sieveOfEratosthenes埃拉托色尼筛选法算法(附完整源码)

    JavaScript实现sieveOfEratosthenes埃拉托色尼筛选法算法(附完整源码) sieveOfEratosthenes.js完整源代码 sieveOfEratosthenes.js完 ...

  4. 埃拉托色尼筛选法------筛选质数

    前戏:本篇介绍一种特定数据范围内统计该段数据内所有质数的高效算法,埃拉托色尼筛选法. 正文: 1.埃拉托色尼筛选法: 埃拉托色尼筛选法(the Sieve of Eratosthenes)简称埃氏筛法 ...

  5. c语言埃拉托色尼筛选法数组,埃拉托色尼筛选法 算法

    埃拉托色尼筛选法 埃拉托色尼选筛法(the Sieve of Eratosthenes)简称埃氏筛法,是古希腊数学家埃拉托色尼(Eratosthenes 274B.C.-194B.C.)提出的一种筛选 ...

  6. 埃拉托色尼筛选法 C++实现

    在公元前3世纪,古希腊天文学家埃拉托色尼发现了一种找出不大于n的所有自然数中的素数的算法,即埃拉托色尼筛选法. 具体筛选步骤: 这种算法首先需要按顺序写出2到n中所有的数. 然后把第一个元素画圈,表示 ...

  7. [编程] 2 python 实现埃拉托色尼筛选法

    1.1简介: 埃拉托色尼筛选法是用来生成质数的经典计算机编程算法,一般用来衡量计算机的速度. 我们知道,质数是能被自己和1整除的整数. 2,3,5,7,11都是质数. 那么算法是如何实现质数的识别呢? ...

  8. 埃拉托色尼筛选法计算素数个数

    埃拉托色尼筛选法计算素数个数 素数:指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数. int main() {int MAXNUM = 1000; // 在这里以1000为例int n ...

  9. 素数处理-埃拉托色尼筛选法(埃式筛)

    素数处理-埃拉托色尼筛选法(埃式筛) 埃拉托色尼筛选法(The Sieve of Eratosthenes) 继欧拉筛之后,我今天补的一篇博客.名字太长了emm.简称就是埃式筛法. 埃筛只能解决1e7 ...

最新文章

  1. ui kit html,开始使用
  2. mysql guid_MySQL – 自动增加到guid
  3. NetBeans Weekly News 刊号 # 27 - Sep 24, 2008
  4. 表现SOTA!DetCo算法:目标检测无监督对比学习
  5. 通向财务自由之路07_利用方案设法启动你的系统
  6. Hibernate查询用法总结
  7. 主板开启网络唤醒(Wake on lan)
  8. 全面剖析《自己动手写操作系统》第五章---makefile文件
  9. iptables高性能前端优化-无压力配置1w+条规则
  10. 360全景倒车影像怎么看_360全景倒车影像开的时候能看到前面的状况吗
  11. 程序员的真实工资是多少?
  12. 高省一个了解网络商家和买家心里的APP,它知道你想要什么
  13. 9.FLINK Sink\API\自定义sink
  14. classname库的使用
  15. 快速让网站内容可以复制
  16. 笔记本 i3 i5 i7 区别
  17. 便携式双向无线电设备-市场现状及未来发展趋势
  18. 项目1_小鲨鱼记账系统
  19. 关于微信小程序获取头像和昵称
  20. 电力系统分析(第二版)Hadi Saadat matlab 第五章 输电线路模型及其特性(教材搬运)

热门文章

  1. 【OpenCV新手教程之十五】水漫金山:OpenCV漫水填充算法(Floodfill)
  2. 绘制花朵-第13届蓝桥杯Scratch选拔赛真题精选
  3. 设置复制粘贴为值快捷键(其他功能同理)
  4. JS数据类型(6种基本数据类型)
  5. CommonJS简介
  6. 抢眼的抢眼工具:TaskManagerEx(The
  7. 360加固宝客户端使用
  8. title属性鼠标放在按钮上显示文字
  9. UE4初探——从外部导入图片
  10. “本分”、有理想的拼多多将会走得更远