下面是四种用java语言编程实现的求最大公约数的方法:

package gcd;

import java.util.ArrayList;
import java.util.List; public class gcd {
public static void main(String[] args) {
long startTime;
long endTime;
long durationTime; int[] testArray1 = new int[]{784, 988, 460, 732, 548, 998, 672, 1024, 888, 512};
int[] testArray2 = new int[]{1024, 82, 92, 128, 58, 2014, 512, 88, 582, 788}; for (int i = 0; i < 10; i++) {
startTime = System.nanoTime();
System.out.println("欧几里得方法:" + Euclid(testArray1[i],testArray2[i]));
endTime = System.nanoTime();
durationTime = endTime - startTime;
System.out.println("欧几里得算法耗时:" + durationTime + "\n"); startTime = System.nanoTime();
System.out.println("连续整数检測法:" + consecutiveIntegersTest(testArray1[i], testArray2[i]));
endTime = System.nanoTime();
durationTime = endTime - startTime;
System.out.println("连续整数检測算法耗时:" + durationTime + "\n"); startTime = System.nanoTime();
System.out.println("辗转相减法:" + consecutiveSubstract(testArray1[i], testArray2[i]));
endTime = System.nanoTime();
durationTime = endTime - startTime;
System.out.println("辗转相减算法耗时:" + durationTime + "\n"); startTime = System.nanoTime();
System.out.println("分解质因数法:" + primeFactors(testArray1[i], testArray2[i]));
endTime = System.nanoTime();
durationTime = endTime - startTime;
System.out.println("分解质因数算法耗时:" + durationTime);
} } /**
* 欧几里得算法求最大公约数
* @param no1
* @param no2
* @return
*/
public static int Euclid(int no1, int no2) {
int remainder;
remainder = no1%no2;
while(remainder != 0) {
no1 = no2;
no2 = remainder;
remainder = no1%no2;
}
return no2;
} /**
* 连续整数检測法
* @param m
* @param n
* @return
*/
public static int consecutiveIntegersTest(int m, int n) {
int t;
if (m > n)
t = n;
else
t = m;
while(true) {
if (m%t == 0 && n%t == 0)
break;
else
t = t - 1;
}
return t;
} /**
* 辗转相减法
* @param num1
* @param num2
* @return
*/
public static int consecutiveSubstract(int num1, int num2) {
while(true) {
if (num1 > num2)
num1 -= num2;
else if (num1 < num2)
num2 -= num1;
else
return num1;
}
} /**
* 分解质因数法
* @param primeNum1
* @param primeNum2
* @return
*/
public static int primeFactors(int primeNum1, int primeNum2) {
int prime_gcd = 1;
int compareListSize;
int temp1, temp2;
int pn1 = primeNum1, pn2 = primeNum2;
List<Integer> num1List = new ArrayList<Integer>();
List<Integer> num2List = new ArrayList<Integer>();
List<Integer> sameNumList = new ArrayList<Integer>();
//求出质因数
for (int i = 2; i < pn1/2;) { //注意此处用的是pn1,而不是primeNum1,primeNum1的值在以下的运行过程会不断减小
if (primeNum1%i == 0) { //求余数,假设能被整除,返回true
temp1 = primeNum1 / i; //求商
primeNum1 = temp1; //将商赋值给primeNum1。又一次推断余数是否为0
num1List.add(i); //将质因数放入num1List
} else if (primeNum1%i != 0) {
i = i + 1; //假设余数不等于0。除数i加1,继续求余数
}
} for (int i = 2; i < pn2/2;) {
if (primeNum2%i == 0) {
temp2 = primeNum2 / i;
primeNum2 = temp2;
num2List.add(i);
} else if (primeNum2%i != 0) {
i = i + 1;
}
}
int num1ListSize = num1List.size();
int num2ListSize = num2List.size();
if (num1ListSize < num2ListSize) {
for (int i = 0; i < num1List.size();) {
if (num2List.contains(num1List.get(i))) {
prime_gcd *= num1List.get(i);
num2List.remove(num2List.indexOf(num1List.get(i)));
num1List.remove(i);
if (num1List.size() == 0 || num2List.size() == 0)
break;
} else {
i = i + 1;
}
}
} else {
for (int i = 0; i < num2List.size(); ) {
if (num1List.contains(num2List.get(i))) {
prime_gcd *= num2List.get(i);
num1List.remove(num1List.indexOf(num2List.get(i)));
num2List.remove(i);
if (num1List.size() == 0 || num2List.size() == 0)
break;
} else {
i = i + 1;
}
}
}
return prime_gcd;
}
}

java求最大公约数(分解质因数)的更多相关文章

  1. Java求最大公约数和最小公倍数

    最大公约数(Greatest Common Divisor(GCD)) 基本概念 最大公因数,也称最大公约数.最大公因子,指两个或多个整数共有约数中最大的一个.a,b的最大公约数记为(a,b),同样的 ...

  2. Java经典案例之-“分解质因数”

    /** * 描述:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. * 分析: * 对n进行分解质因数,应该先找到一个最小的质数k,然后按照下列步骤进行: * (1)如果这个质数恰 ...

  3. java求最大公约数,和最小公倍数

    import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner sc = ...

  4. 初学Java 求最大公约数

    import java.util.Scanner; public class GreatesCommonDivisor { public static void main(String[] args) ...

  5. C语言程序设计100例之(5):分解质因数

    例5    分解质因数 题目描述 将一个正整数分解质因数.例如:输入90,输出 90=2*3*3*5. 输入 输入数据包含多行,每行是一个正整数n (1<n <100000) . 输出 对 ...

  6. C++实例 分解质因数

    分解质因数: 每个合数都可以写成几个质数相乘的形式.其中每个质数都是这个合数的因数,叫做这个合数的分解质因数.分解质因数只针对合数. 分解质因数的算式叫短除法.求一个数分解质因数,要从最小的质数除起, ...

  7. 分解质因数法求最大公约数(javascrip实现)

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  8. java 分解质因数

    算法目的:对一个正整数分解质因数 一.算法分析: 1.建立整数列表,保存求到的因数. 2.声明整数i=2,用以递增取模:整数m,用于临时保存n 3.建立while循环,i小于等于整数m时,判断m%i, ...

  9. java代码分解质因数

    总结: 循环...首位 逻辑要清晰 很简单.首先质因数最小的2.因为1不是质数 然后当输入的数刚好为2时,结束.不用下一步了.否则在循环里不停的输出一个数, 当输入的数比2大时,分能被2整除和不能被2 ...

随机推荐

  1. 使用JustDecompile修改程序集

    原文:使用JustDecompile修改程序集        JustDecompile是Telerik公司推出一个免费的.net反编译工具,支持插件,与Visual Studio 2010,2012 ...

  2. easyui出口excel无法下载框弹出的办法来解决

    使用前ajax发,码如下面(ActionUrl一般处理程序ashx路径): $.ajax({ url: ActionUrl + '?action=export&ID=' + $('#fm_ID ...

  3. Facebook Asynchronous Layout and Rending

    Facebook Asynchronous Layout and Rending by 吴雪莹 dispatch_async(backgroundQueue, ^{ storyNode = [[FBS ...

  4. Android 反编译(一,apktool+smail2java)

    一:解压缩(获取图片等资源) 对于apk中丰富的资源,假设我们在练习的时候须要引用某些apk中的资源文件时,最简单的办法使用解压缩工具对apk进行解压缩,然后在对应的文件夹下查找须要的资源文件. 二: ...

  5. CSharp SQLServer 登陆

    =======后台SQLServer存储过程================ --创建数据库create database Stu; --创建表use MyShool;if exists(select ...

  6. Eclipse工具的问题

    1 Eclipse采用ctrl抄 粘贴很卡 Eclipse -- Windows->Preferences->General->Editors->Text Editors-&g ...

  7. hdu1964之插头DP求最优值

    Pipes Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  8. oracle 12c 三学习 pdb 可插拔测试

    DECLARE l_result BOOLEAN; BEGIN l_result := DBMS_PDB.check_plug_compatibility( pdb_descr_file => ...

  9. 谈谈CListCtrl 扩展风格设置方法-SetExtendedStyle和ModifyStyleEx 比較

    谈谈CListCtrl 扩展风格设置方法 --------------------------------------SetExtendedStyle和ModifyStyleEx 比較 对于刚開始学习 ...

  10. 解决mysqldb查询大量数据导致内存使用过高的问题

    1.源码 connection=MySQLdb.connect( host="thehost",user="theuser", passwd="the ...