java求最大公约数(分解质因数)
下面是四种用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求最大公约数(分解质因数)的更多相关文章
- Java求最大公约数和最小公倍数
最大公约数(Greatest Common Divisor(GCD)) 基本概念 最大公因数,也称最大公约数.最大公因子,指两个或多个整数共有约数中最大的一个.a,b的最大公约数记为(a,b),同样的 ...
- Java经典案例之-“分解质因数”
/** * 描述:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. * 分析: * 对n进行分解质因数,应该先找到一个最小的质数k,然后按照下列步骤进行: * (1)如果这个质数恰 ...
- java求最大公约数,和最小公倍数
import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner sc = ...
- 初学Java 求最大公约数
import java.util.Scanner; public class GreatesCommonDivisor { public static void main(String[] args) ...
- C语言程序设计100例之(5):分解质因数
例5 分解质因数 题目描述 将一个正整数分解质因数.例如:输入90,输出 90=2*3*3*5. 输入 输入数据包含多行,每行是一个正整数n (1<n <100000) . 输出 对 ...
- C++实例 分解质因数
分解质因数: 每个合数都可以写成几个质数相乘的形式.其中每个质数都是这个合数的因数,叫做这个合数的分解质因数.分解质因数只针对合数. 分解质因数的算式叫短除法.求一个数分解质因数,要从最小的质数除起, ...
- 分解质因数法求最大公约数(javascrip实现)
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- java 分解质因数
算法目的:对一个正整数分解质因数 一.算法分析: 1.建立整数列表,保存求到的因数. 2.声明整数i=2,用以递增取模:整数m,用于临时保存n 3.建立while循环,i小于等于整数m时,判断m%i, ...
- java代码分解质因数
总结: 循环...首位 逻辑要清晰 很简单.首先质因数最小的2.因为1不是质数 然后当输入的数刚好为2时,结束.不用下一步了.否则在循环里不停的输出一个数, 当输入的数比2大时,分能被2整除和不能被2 ...
随机推荐
- C++写一个简单的解析器(分析C语言)
该方案实现了一个分析C语言的词法分析+解析. 注意: 1.简单语法,部分秕.它可以在本文法的基础上进行扩展,此过程使用自上而下LL(1)语法. 2.自己主动能达到求First 集和 Follow 集. ...
- The app references non-public selectors in payload With Xcode6.1
猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: p=591" style="color: rgb(255, 97, 0 ...
- Android游戏源代码合集(主要是AndEngine和Libgdx的)
近期在网络上看到有网友抱怨Android游戏源代码找不到,所以小弟收集了一些AndEngine和Libgdx的游戏源代码,以Eclipseproject的形式配置好环境,再陆续发出(某引擎避嫌,不在此 ...
- Web Reference for a WCF Service has Extra “IdSpecified” Parameter ?
Question: I created a WCF service that exposed a method that has one paramater: public class Service ...
- 说说nio2
利不百不变法,功不十不易器 为什么会出现nio,之前的io有什么问题? 请先看 说说nio1 nio类图例如以下 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZX ...
- iOS结合导航控制器和标签栏控制器
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name=& ...
- NET WEB
.NET WEB程序员需要掌握的技能 2015-12-28 08:50 by 敏捷的水, 3997 阅读, 66 评论, 收藏, 编辑 本来这个是我给我们公司入职的新人做一个参考,由于 @张善友 老师 ...
- DICOM医学图像处理:开源库mDCM与DCMTK的比較分析(一),JPEG无损压缩DCM图像
背景介绍: 近期项目需求,须要使用C#进行最新的UI和相关DICOM3.0医学图像模块的开发.在C++语言下,我使用的是应用最广泛的DCMTK开源库,在本专栏的起初阶段的大多数博文都是对DCMTK开源 ...
- leetcode第一刷_Merge Sorted Array
水题,只是思想还是实用的. 当然能够新建出一个数组.比較着拷贝过去.可是没有必要啊亲.想想为什么用源数组会麻烦,由于确定了前面的数.为了后面的数字不被覆盖,要依次往后移,转念一想,先确定后面的数字.就 ...
- JXL组件生成报告错误(两)
JXL组件生成报告 1.详细报错例如以下: usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -non ...