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 ...
随机推荐
- hdu1561(树形背包)
给定n,m表示n个城堡,我们可以选择攻占m个城堡.要使得价值最大 接下来n行 a b, 第i行的a b,表示攻占第i个城堡的价值为b,但需要先攻占第a个城堡 如果有多个a=0的点,那么就不是一棵树 ...
- Google Maps Android API v2 (2)- 地图对象
地图对象 Android的谷歌地图API允许你在你的Android应用程序中显示谷歌地图.在谷歌地图移动(GMM)的应用程序,你看到的地图,这些地图具有相同的外观和API暴露出许多相同的功能.GM ...
- minihomepage.exe 百度视频迷你主页
百度视频最近动作可真.延续"DHot.exe 热点资讯"之后,又在桌面上出现了Tips窗体,例如以下图: 尽管是迷你的,可还是把其他桌面图标给挡了啊! 突然出来这么个窗体.我还以为 ...
- DOMContentLoaded和window.onload
相信写js的.都知道window.onload吧,可是并非每一个人都知道DOMContentLoaded,事实上即使你不知道.非常有可能你也常常使用了这个东西. 普通情况下,DOMContentLoa ...
- Linux下一个php+mysql+nginx构建编译(三)
在此之前一直是一个关键构建webserver.但一个关键的建筑环境都比较旧的.假定使用一个相对较新的环境,尤其是正式的server.您必须手动编译自己建(基于以下的结构linux centos6.5 ...
- 设计师给了px显着的单位,Android要设置多少开发商dip、dp、sp?
此链接 http://blog.csdn.net/xiaodongrush/article/details/29560431 1. 要开发一款Android APP,设计师和开发要约定哪些事情? ...
- 9种CSS3 blend模式制作的鼠标滑过图片标题特效
这是一款使用CSS3 background-blend-mode制作的鼠标滑过图片标题特效.该图片标题特效在鼠标滑过一张图片的时候,图片的标题会对应的动画,而且图片会使用css blend模式渲染为很 ...
- 抓取csdn上的各类别的文章 (制作csdn app 二)
转载请表明出处:http://blog.csdn.net/lmj623565791/article/details/23532797 这篇博客接着上一篇(Android 使用Fragment,View ...
- NFS 配置服务
NFS 配置服务 北京市海淀区 张俊浩 一.NFS.即网络文件系统(Network File System,NFS).一种使用于分散式文件系统的协议,由升阳公司开发.于1984年向外发布.功能是通过 ...
- [LeetCode228]Summary Ranges
题目: Given a sorted integer array without duplicates, return the summary of its ranges. For example, ...