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 ...
随机推荐
- swift笔记 (三) —— 字符和字符串
字符串和字符 苹果要是不提供了unicode的字符串和字符,那就是他们公司全部人的脑袋都被门夹过 他自己家都要发非常多国家的版本号的软件,怎么可能不用unicode呢 此处略去30字... 这里能够拿 ...
- c++ 计算程序运行时间
转载 http://blog.csdn.net/trustbo/article/details/10582287 以前经常听人提起如何计算程序运行时间,给出一系列函数,当时没有注意,随便选了clock ...
- C# 隐藏 Windows Phone 侦错模式中萤幕右上角的数据条(模拟器、实机可用),截图好方便。
原文:C# 隐藏 Windows Phone 侦错模式中萤幕右上角的数据条(模拟器.实机可用),截图好方便. 一般我们在开发Windows Phone App时,会使用模拟器或是实体的手机开发,在Vi ...
- bat脚本命令
注:本文转载地址 http://www.cnblogs.com/yefengmeander/archive/2011/12/01/2887978.html 1.Echo 命令 打开回显或关闭请求回显 ...
- APUE学习总结
简介 本文总结了个人,一个数字,对应称号<APUE>第一版的每一章,但是,独立的二级标题和书,人需求进行编写. 3.文件I/O 本章所说明的函数常常被称之为不带缓存的I/O(与第5章中说明 ...
- 怎么样putty打开图形化管理工具,在终端上
有时需要在putty这种图形终端开放的图形化管理工具将出现以下错误: [root@node2 ~]# Traceback (most recent call last): File "/us ...
- Nginx+Varnish
Nginx+Varnish 实现动静分离,为服务器分流,降低服务器负载 相必大家在看加快网站响应速度方面的文章时,都提过这么一条:动静分离.那怎样实现动静分离呢,这里笔者就亲自搭建相关服务实现动静分离 ...
- 【UVA272】TEX Quotes
A - TEX Quotes Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submitcid=80 ...
- ProgressBar样式总结与自己主动填充方法(代码)
有时候开发的时候须要用一个进度条告知用户眼下正在执行一个耗时操作,可是并不须要明白知道某个value来setProgress,所以就能够自己定义一个时间和进度让进度条自己主动执行了. 以下是代码: H ...
- Java模式(适配器型号)
今天阅读Java该适配器模式,这里有一个小的总结和下谈感受.对于将来使用. 首先.让我们有关适配器先说说. 适应是“来源”至“目标”适应.其中连接这两个的关系是适配器.它负责“源”过度到“目标”. 举 ...