Java算法最大公约数和最小公倍数
用辗转相除法求最大公约数java

用辗转相除法求最大公约数java用辗转相除法求最大公约数,是一种简单且常用的算法。
这个算法基于一个简单的道理,两个数的最大公约数也是其中较小数与两数的差的最大公约数。
首先,我们需要了解什么是最大公约数。
最大公约数,也叫最大公因数,指的是两个或多个整数共有的约数中最大的一个。
它在数学上具有很多应用,比如化简分数、求解线性方程等。
接下来,我们将以Java编程语言为例,详细介绍如何用辗转相除法求最大公约数。
步骤一:获取输入的两个整数我们首先需要从用户那里获取两个整数。
可以使用Java的Scanner类来实现用户输入的功能。
代码如下:javaimport java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入第一个整数:");int num1 = scanner.nextInt();System.out.println("请输入第二个整数:");int num2 = scanner.nextInt();其他代码scanner.close();}}步骤二:实现辗转相除法辗转相除法基于一个简单的原理:两个数的最大公约数也是其中较小数与两数的差的最大公约数。
我们可以使用递归的方式来实现这个算法。
代码如下:javapublic class Main {辗转相除法计算最大公约数public static int gcd(int num1, int num2) {if (num2 == 0) {return num1;}return gcd(num2, num1 num2);}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入第一个整数:");int num1 = scanner.nextInt();System.out.println("请输入第二个整数:");int num2 = scanner.nextInt();int result = gcd(num1, num2);System.out.println("最大公约数是:" + result);scanner.close();}}解释一下上面的代码。
JAVA算法编程题全集(50题及答案)

程序1。
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?//这是一个菲波拉契数列问题public class lianxi01 {public static void main(String[] args) {System.out.println("第1个月的兔子对数: 1");System.out.println("第2个月的兔子对数: 1");int f1 = 1, f2 = 1, f, M=24;for(int i=3; i<=M; i++) {f = f2;f2 = f1 + f2;f1 = f;System.out.println("第" + i +"个月的兔子对数: "+f2);}}}。
程序2。
题目:判断101-200之间有多少个素数,并输出所有素数。
程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
public class lianxi02 {public static void main(String[] args) {int count = 0;for(int i=101; i<200; i+=2) {boolean b = false;for(int j=2; j<=Math.sqrt(i); j++){if(i % j == 0) { b = false; break; }else { b = true; }}if(b == true) {count ++;System.out.println(i );}}System.out.println( "素数个数是: " + count);}}。
程序3。
题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。
最大公约数和最小公倍数Java源程序

//求长整型数a和长整型数b的最大公约数和最小公倍数,Test类为主类class GreatestCommonDivisor //求长整型数a和长整型数b的最大公约数,同时输出a和b的所有约数{private long a;private long b;private Divisor aDivisor;private Divisor bDivisor;GreatestCommonDivisor(){a = 1;b = 1;aDivisor = new Divisor();bDivisor = new Divisor();}GreatestCommonDivisor(long a,long b){this.a = a;this.b = b;aDivisor = new Divisor(a);bDivisor = new Divisor(b);}public void setA(long a){this.a = a;}public long getA(){return a;}public void setB(long b){this.b = b;}public long getB(){return b;}public void setADivisor(Divisor aDivisor){this.aDivisor = aDivisor;}public Divisor getADivisor(){return aDivisor;}public void setBDivisor(Divisor bDivisor){this.bDivisor = bDivisor;}public Divisor getBDivisor(){return bDivisor;}/** 直接求两个数a和b的最大公约数,用较大数依次除以较小数的所有约数,其中最大的约数即为最大公约数* 即用较小数的所有约数,包括较小数本身,按照从大到小的顺序依次去除较大数* 第一个能把较大数除尽的数就是最大公约数public long getGreatestCommonDivisor(){long result = 1;long n = 0;if(a==0){result = b;}else if(b==0){result = a;}else{long absA = 1;long absB = 1;long littleNumber = 1;long bigNumber = 1;absA = Math.abs(a);absB = Math.abs(b);if(absA<absB){littleNumber = absA;bigNumber = absB;}else{littleNumber = absB;bigNumber = absA;//System.out.println("littleNumber=" + littleNumber);//System.out.println("bigNumber=" + bigNumber);long i = littleNumber;while(i>1){if(bigNumber%i==0){break;}else{do{i--;}while(littleNumber%i!=0);if(bigNumber%i==0){break;}}}if(a<0 && b<0){result = -i;}else if(a>0 && b>0){result = i;}else{result = 1;}}return result;}*/public long getGreatestCommonDivisor(){long result = 1;if(getA()==0){if(getB()!=0){result = getB(); //定义0与另一个非零数a的最大公约数GCD(0,a)=a }elseresult = 1; //定义0与0的最大公约数GCD(0,0)=1}}else if(getB()==0){if(getA()!=0){result = getA(); //定义0与另一个非零数a的最大公约数GCD(0,a)=a }else{result = 1; //定义0与0的最大公约数GCD(0,0)=1}}else //求两个非零数的最大公约数{long commonDivisor[];commonDivisor=aDivisor.getCommonDivisor(bDivisor);for(int i = 1;i<(int)commonDivisor[0];i++){if(result<commonDivisor[i]){result = commonDivisor[i];}}if(getA()<0 && getB()<0){result = -result; //两个负数的最大公约数是负数}else if(getA()>0 && getB()>0) //两个正数的最大公约数已经求出,不做处理{}else{result = 1; //两个异号数的最大公约数是1}}return result;}public void displayGreatestCommonDivisor(){System.out.println(getA() + "和"+ getB() + "的最大公约数是:"+ getGreatestCommonDivisor());}}class Divisor //求长整型a的所有约数{private long a;private long divisor[];private final int MAXIMUMINDEXOFDIVISOR = 10000;Divisor(){a = 1;divisor = new long[MAXIMUMINDEXOFDIVISOR];divisor[0] = 1;divisor[1] = 1;for (int i = 2;i<MAXIMUMINDEXOFDIVISOR;i++){divisor[i] = 1;}}Divisor(long a){if(a>=0){a = a;}else{a = -a;}this.a = a;divisor = new long[MAXIMUMINDEXOFDIVISOR];divisor[0] = 1;divisor[1] = 1;int index = 2;//数字a的约数的顺序号for (long j = 2;j<=getA();j++){if(getA()%j==0){divisor[index] = j;System.out.printf("divisor[index]=%5d\t",divisor[index]);index++;}}index--;divisor[0] = index;System.out.printf("divisor[0]=%5d\n",divisor[0]);for(int j = index + 1;j<MAXIMUMINDEXOFDIVISOR;j++){divisor[j] = 1;}}public void setA(long a){if(a>=0){this.a = a;}else{this.a = -a;}}public long getA(){return a;}public void setDivisor(){divisor[0] = 1;divisor[1] = 1;int index = 1;//属性a的约数的顺序号for(long j = 2;j<=getA();j++){if(getA()%j==0){index++;divisor[index] = j;}}divisor[0] = index;for(int j = index + 1;j<MAXIMUMINDEXOFDIVISOR;j++){divisor[j] = 1;}}public long[] getDivisor(){return divisor;}public long[] getCommonDivisor(Divisor aDivisor) //求本对象的成员变量a和另一个类Divsior型对象中的成员变量a的所有公约数{long []result = new long[MAXIMUMINDEXOFDIVISOR];long otherDivisor[] = aDivisor.getDivisor();int littleIndex = (int)(divisor[0]<otherDivisor[0]?divisor[0]:otherDivisor[0]);int bigIndex = (int)(divisor[0]>otherDivisor[0]?divisor[0]:otherDivisor[0]);//System.out.printf("littleIndex=%5d\tbigIndex=%5d\t",littleIndex,bigIndex);int commonDivisorIndex = 1;result[0] = 1;result[1] =1;for(int i = 2;i<=littleIndex;i++){for(int j = 2;j<=bigIndex;j++){if(divisor[i]==otherDivisor[j]){commonDivisorIndex++;result[commonDivisorIndex] = divisor[i];}}}result[0] = commonDivisorIndex;for(int j = commonDivisorIndex + 1;j<MAXIMUMINDEXOFDIVISOR;j++){result[j] = 1;}return result;}public void displayDivisor(){long aDivisor[];aDivisor = getDivisor();System.out.println(getA() + "有" + aDivisor[0] + "个约数,分别是:");for(int i = 1;i<=aDivisor[0];i++){System.out.printf("\t%10d",aDivisor[i]);}}}class LeastCommonMultiple //求成员变量a和成员变量b的最小公倍数{private long a;private long b;LeastCommonMultiple(){a = 1;b = 1;}LeastCommonMultiple(long a,long b){this.a = a;this.b = b;}public void setA(long a){this.a = a;}public long getA(){return a;}public void setB(long b){this.b = b;}public long getB(){return b;}public long getLeastCommonMultiple(){GreatestCommonDivisor gCD = new GreatestCommonDivisor(a,b);long result = 1;if(a==0 && b==0) //定义0和一个数a的最小公倍数LCM(0,a)=0{result = 0;}else{result = a * b / gCD.getGreatestCommonDivisor();}return result;}public void displayLeastCommonMultiple(){System.out.println(getA() + "和"+ getB() + "的最小公倍数是:"+ getLeastCommonMultiple());}}public class Test{public static void main(String [] args){GreatestCommonDivisor gCD = new GreatestCommonDivisor(40,60);gCD.displayGreatestCommonDivisor();LeastCommonMultiple leastCommonMultiple = new LeastCommonMultiple(gCD.getA(),gCD.getB());leastCommonMultiple.displayLeastCommonMultiple();/*GreatestCommonDivisor greatestCommonDivisor = new GreatestCommonDivisor(40,0);SubGreatestCommonDivisor subGreatestCommonDivisor = new SubGreatestCommonDivisor(greatestCommonDivisor.getA(),greatestCommonDivisor.getB());System.out.println(greatestCommonDivisor.getA() + "和"+ greatestCommonDivisor.getB() + "的最大公约数是:"+ greatestCommonDivisor.getGreatestCommonDivisor());System.out.println(subGreatestCommonDivisor.getA() + "和"+ subGreatestCommonDivisor.getB() + "的最小公倍数是:"+ subGreatestCommonDivisor.getGreatestCommonDivisor());*/}}。
Java实现:求两个数的最大公约数

Java实现:求两个数的最⼤公约数title: Java实现:求两个数的最⼤公约数tags:java算法categories: 个⼈笔记copyright: trueabbrlink: f202date: 2019-12-07 16:44:58求解两个数的最⼤公约数的⼏种⽅法的⽐较1. 暴⼒枚举法优点:思路简单缺点:运算次数多,效率低极端例⼦:求1000和10001的最⼤公约数需要计算1000/2 - 1 = 4999次// 暴⼒枚举法public static int getGreatestCommonDivisor(int a,int b) {int big = a > b ? a : b;int small = a < b ? a : b;if (big % small == 0) {return small;}for (int i = small / 2; i > 1; i--) {if (big % i == 0 && small % i == 0) {return i;}}return 1;}2. 辗转相除法优点:运算次数少确定:模运算的开销较⼤// 辗转相除法public static int getGreatestCommonDivisor2(int a, int b) {int big = a > b ? a : b;int small = a < b ? a : b;if (big % small == 0) {return small;}return getGreatestCommonDivisor2(big % small, small);}3. 更相减损法优点:避免了取模运算,采⽤减法运算,开销较⼩缺点:算法性能不稳定,运算次数多极端例⼦:两数相差悬殊时,如求1和10001的最⼤公约数,需要递归9999次// 更相减损法public static int getGreatestCommonDivisor3(int a, int b) {if(a == b){return a;}int big = a > b ? a : b;int small = a < b ? a : b;return getGreatestCommonDivisor2(big - small, small);}4. 结合辗转相除法和更相减损法(位运算优化)当a和b均为偶数时,gcd(a,b) = 2×gcd(a/2,b/2) = 2×gcd(a >>1,b>>1)。
JAVA经典算法题目(含答案)

int N;
N=0;
try{
N=Integer.parseInt(str);
}
catch(NumberFormatException e){
e.printStackTrace();
}
str=(N>90?"A":(N>60?"B":"C"));
System.out.println(str);
}
}
【程序 6】 题目:输入两个正整数 m 和 n,求其最大公约数和最小公倍数。 1.程序分析:利用辗除法。 最大公约数:
public static void main(String args[]){ int i=0; for(i=1;i<=20;i++) System.out.println(f(i));
} public static int f(int x) {
if(x==1 || x==2) return 1;
else return f(x-1)+f(x-2);
System.exit(0);///不能少这句,否则结果会出错 } public static void main(String[] args){
String str=""; exp2 c=new exp2();
str=javax.swing.JOptionPane.showInputDialog("请输入N的值(输入exit退出):"); int N;
{
if(N<0||M<0)
{
System.out.println("ERROR!");
return -1;
java求最大公约数的方法_概述及解释说明

java求最大公约数的方法概述及解释说明1. 引言1.1 概述在计算机编程中,求最大公约数是一个常见且重要的问题。
最大公约数(Greatest Common Divisor,简称GCD)是指能同时整除给定两个或多个整数的最大正整数。
在解决实际问题时,求最大公约数可以帮助我们简化计算、优化算法,并提高程序的效率。
本文将介绍Java中求解最大公约数的方法。
1.2 文章结构本文分为以下几个部分来讨论Java中求解最大公约数的方法:- 引言:对本文进行概述和说明。
- 最大公约数的概念与性质:介绍最大公约数的定义、性质以及其意义与应用。
- Java中求最大公约数的方法:探讨目前常用的三种方法,包括辗转相除法、基于质因数分解的方法和比较法。
- 方法解释与实现示例:对每种方法进行详细描述,并给出具体实现示例。
- 结论:总结本文内容,并提供不同情景下选择和应用建议。
1.3 目的本文旨在全面介绍Java中求解最大公约数的常见方法,通过详细说明每种方法的原理和实现步骤,使读者能够理解不同方法之间的比较,从而在实际应用中选择合适的求解方法。
通过本文的学习,读者将能够掌握Java求最大公约数的技巧,并能够灵活运用于问题解决中。
2. 最大公约数的概念与性质2.1 基本定义:最大公约数(Greatest Common Divisor,简称GCD)指的是两个或多个整数共有的最大因数,即能够同时整除这些整数的最大正整数。
例如,对于整数30和45来说,它们的最大公约数为15,因为15既能整除30也能整除45。
2.2 公约数的性质:- 公约数必然是它所对应被求公约数的两个或多个整数的因子。
- 任意两个非零正整数一定存在一个共同的因子,即它们至少存在一个公约数。
- 若a和b是整数,则它们的绝对值之间的最小正值就是它们的最大公约数。
2.3 最大公约数的意义与应用:最大公约数在很多实际问题中都有着重要意义和广泛应用:- 通讯传输:在数据传输过程中需要保证数据正确无误地接收。
JAVA经典算法面试40题及答案

JAVA经典算法⾯试40题及答案现在是3⽉份,也是每年开年企业公司招聘的⾼峰期,同时有许多的朋友也出来找⼯作。
现在的招聘他们有时会给你出⼀套⾯试题或者智⼒测试题,也有的直接让你上机操作,写⼀段程序。
算法的计算不乏出现,基于这个原因我⾃⼰搜集了⼀些算法上的题型。
希望对于⼤家有所帮助。
【程序1】题⽬:古典问题:有⼀对兔⼦,从出⽣后第3个⽉起每个⽉都⽣⼀对兔⼦,⼩兔⼦长到第四个⽉后每个⽉⼜⽣⼀对兔⼦,假如兔⼦都不死,问每个⽉的兔⼦总数为多少?1.程序分析:兔⼦的规律为数列1,1,2,3,5,8,13,21….public class exp2{public static void main(String args[]){int i=0;for(i=1;i<=20;i++)System.out.println(f(i));}public static int f(int x){if(x==1 || x==2)return 1;elsereturn f(x-1)+f(x-2);}}或public class exp2{public static void main(String args[]){int i=0;math mymath = new math();for(i=1;i<=20;i++)System.out.println(mymath.f(i));}}class math{public int f(int x){if(x==1 || x==2)return 1;elsereturn f(x-1)+f(x-2);}}【程序2】题⽬:判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的⽅法:⽤⼀个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
public class exp2{public static void main(String args[]){int i=0;math mymath = new math();for(i=2;i<=200;i++)if(mymath.iszhishu(i)==true)System.out.println(i);}}class math{public int f(int x){if(x==1 || x==2)return 1;elsereturn f(x-1)+f(x-2);}public boolean iszhishu(int x){for(int i=2;i<=x/2;i++)if (x % 2==0 )return false;return true;}}【程序3】题⽬:打印出所有的 “⽔仙花数 “,所谓 “⽔仙花数 “是指⼀个三位数,其各位数字⽴⽅和等于该数本⾝。
输入两个正整数m和n,求其最大公约数和最小公倍数

输⼊两个正整数m和n,求其最⼤公约数和最⼩公倍数题⽬:输⼊两个正整数m和n,求其最⼤公约数和最⼩公倍数。
程序分析:利⽤辗除法。
在循环中,只要除数不等于0,⽤较⼤数除以较⼩的数,将⼩的⼀个数作为下⼀轮循环的⼤数,取得的余数作为下⼀轮循环的较⼩的数,如此循环直到较⼩的数的值为0,返回较⼤的数,此数即为最⼩公约数,最⼩公倍数为两数之积除以最⼩公倍数。
1package com.li.FiftyAlgorthm;23import java.util.Scanner;45/**b6 * 题⽬:输⼊两个正整数m和n,求其最⼤公约数和最⼩公倍数。
程序分析:利⽤辗除法。
7 * 在循环中,只要除数不等于0,⽤较⼤数除以较⼩的数,将⼩的⼀个数作为下⼀轮循环的⼤数,取得的余数作为下⼀轮循环的较⼩的数,如此循环直到较⼩的数的值为0,返回8 * 较⼤的数,此数即为最⼩公约数,最⼩公倍数为两数之积除以最⼩公倍数。
9 *10 * @author yejin11 *12*/13public class CommonDiviser {14public static void main(String[] args) {15int a, b;16 Scanner s1 = new Scanner(System.in);17 Scanner s2 = new Scanner(System.in);18 a = s1.nextInt();19 b = s2.nextInt();20 CommonDiviser cd = new CommonDiviser();21int m = cd.division(a, b);22int n = a * b / m;23 System.out.println("最⼤公约数: " + m);24 System.out.println("最⼩公倍数: " + n);25 }2627public int division(int x, int y) {28int t;29if (x < y) {30 t = x;31 x = y;32 y = t;33 }3435while (y != 0) {36if (x == y)37return 1;38else {39int k = x % y;40 x = y;41 y = k;42 }43 }44return x;45 }46 }。