⑴ java求最小公倍数和最大公约数
/**
* 最大公约数
* 更相减损法:也叫更相减损术
* ??? 第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
* 第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
* @param a
* @param b
* @return
*/
public static int gongyue( int a, int b){
if(a == b){
return a;
} else{
return gongyue(abs (a-b),min(a,b));
}
}
/**
* 最大公约数
* 辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法.
* 例如,求(319,377):
* ∵ 377÷319=1(余58)
* ∴(377,319)=(319,58);
* ∵ 319÷58=5(余29),
* ∵ 58÷29=2(余0),
* ∴ (58,29)= 29;
* ∴ (319,377)=29.
* @param a
* @param b
* @return
*/
public static int gongyue1( int a, int b){
if(b!=0){
return gongyue1(b,a%b);
} else{
return a;
}
}
/**
* 最小公倍数
* 两个数乘积除去最大公约数即可
* @param a
* @param b
* @return
*/
public static int gongbei( int a, int b){
return a*b/gongyue(a,b);
}
public static int abs(int i){
return i>=0?i:-i;
}
public static int min(int a,int b){
return a<b?a:b;
}
⑵ java最大公约数算法
三种算法:
//欧几里得算法(辗转相除):
public static int gcd(int m,int n) {
if(m<n) {
int k=m;
m=n;
n=k;
}
//if(m%n!=0) {
// m=m%n;
// return gcd(m,n);
//}
//return n;
return m%n == 0?n:gcd(n,m%n);
}
//连续整数检测算法:
public static int gcd1(int m,int n) {
int t;
if(m<n) {
t=m;
}else {
t=n;
}
while(m%t!=0||n%t!=0){
t--;
}
return t;
}
//公因数法:(更相减损)
public static int gcd2(int m,int n) {
int i=0,t,x;
while(m%2==0&n%2==0) {
m/=2;
n/=2;
i++;
}
if(m<n){
t=m;
m=n;
n=t;
}
while(n!=(m-n)) {
x=m-n;
m=(n>x)?n:x;
n=(n<x)?n:x;
}
if(i==0)
return n;
else
return (int)Math.pow(2, i)*n;
}
public static void main(String[] args) {
System.out.println("请输入两个正整数:");
Scanner scan = new Scanner(System.in);
Scanner scan2=new Scanner(System.in);
int m=scan.nextInt();
int n=scan2.nextInt();
System.out.println("欧几里得算法求最大公约数是:"+gcd(m,n));
System.out.println("连续整数检测算法求最大公约数是:"+gcd1(m,n));
System.out.println("公因数法求最大公约数是:"+gcd2(m,n));
}
}
⑶ Java求最大公约数
publicclassGcd{
publicstaticvoidmain(String[]args){
for(inti=0;i<10;i++){
inta=(int)(Math.random()*99+1);
intb=(int)(Math.random()*99+1);
System.out.println(a+","+b+" => "+getNumber(a,b));
}
}
publicstaticintgetNumber(intm,intn){
if(m%n==0){
returnn;
}
else{
returngetNumber(n,m%n);
}
}
}
⑷ 求 最大公约数 Java
可以直接用hoe,一个Java基础操作库,里面有最大公约数和最小公倍数的算法
//最大公约数
System.out.println(NumberHoe.gcd(2,8));//result=2
System.out.println(NumberHoe.gcd(12,16,40));//result=4
//最小公倍数
System.out.println(NumberHoe.lcm(2,3));//result=6
System.out.println(NumberHoe.lcm(2,6,22));//result=66
源码如下
https://github.com/caspar-chen/hoe/blob/master/src/main/java/com/caspar/hoe/NumberHoe.java
⑸ java求最大公约数,感觉思路没问题,最后说我为初始化变量
最大公约数和最小公倍数的方法如下,赠送你一个最小公倍数的算法:
publicclassCandC{
//下面的方法是求出最大公约数
publicstaticintgys(intm,intn){
while(true){
if((m=m%n)==0)
returnn;
if((n=n%m)==0)
returnm;
}
}
publicstaticvoidmain(Stringargs[])throwsException{
//取得输入值
//Scannerchin=newScanner(System.in);
//inta=chin.nextInt(),b=chin.nextInt();
inta=23;
intb=32;
intc=gys(a,b);
System.out.println("最小公倍数:"+a*b/c+" 最大公约数:"+c);
}
}
⑹ 用java从键盘输入两个正整数,求他们的最大公约数
从键盘输入那么就会用到Java的Scanner类,最大公约数,这里会用到算法,网络上面也有,下面是其中一种:
importjava.util.Scanner;
publicclassTestDivisor{
publicstaticvoidmain(String[]args){
Scannerinput=newScanner(System.in);//新建一个输入流对象,这里会导包
System.out.println("请输入第一个数:");
intnum1=input.nextInt();//接收输入的整数
System.out.println("请输入第二个数:");
intnum2=input.nextInt();//接收输入的整数
intnum3=num1%num2;//num1跟num2取余得到num3
while(num3>0){
num1=num2;
num2=num3;
num3=num1%num2;
}
input.close();//关闭输入流
System.out.println("最大公约数是:"+num2);
}
}
/**
GCD算法的实现--GCB是最大公约数缩写
2.1递归实现
intgcd(inta,intb)
{
if(!b)returna;
elsereturngcd(b,a%b);
}
2.2迭代实现
intgcd(inta,intb)
{
intc=a%b;
while(c){
a=b;
b=c;
c=a%b;
}
returnb;
}
*
*/
⑺ java编写求最大公约数和最小公倍数的程序
输入两个正整数m和n, 求其最大公约数和最小公倍数.
用辗转相除法求最大公约数
算法描述:
m对n求余为a, 若a不等于0
则 m <- n, n <- a, 继续求余
否则 n 为最大公约数
最小公倍数 = 两个数的积 / 最大公约数
#include
int main()
{
int m, n;
int m_cup, n_cup, res; /*被除数, 除数, 余数*/
printf("Enter two integer:\n");
scanf("%d %d", &m, &n);
if (m > 0 && n >0)
{
m_cup = m;
n_cup = n;
res = m_cup % n_cup;
while (res != 0)
{
m_cup = n_cup;
n_cup = res;
res = m_cup % n_cup;
}
printf("Greatest common divisor: %d\n", n_cup);
printf("Lease common multiple : %d\n", m * n / n_cup);
}
else printf("Error!\n");
return 0;
}
★ 关于辗转相除法, 搜了一下, 在我国古代的《九章算术》中就有记载,现摘录如下:
约分术曰:“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。”
其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法,实际上就是辗转相除法。
辗转相除法求最大公约数,是一种比较好的方法,比较快。
对于52317和75569两个数,你能迅速地求出它们的最大公约数吗?一般来说你会找一找公共的使因子,这题可麻烦了,不好找,质因子大。
现在教你用辗转相除法来求最大公约数。
先用较大的75569除以52317,得商1,余数23252,再以52317除以23252,得商2,余数是5813,再用23252做被除数,5813做除数,正好除尽得商数4。这样5813就是75569和52317的最大公约数。你要是用分解使因数的办法,肯定找不到。
那么,这辗转相除法为什么能得到最大公约数呢?下面我就给大伙谈谈。
比如说有要求a、b两个整数的最大公约数,a>b,那么我们先用a除以b,得到商8,余数r1:a÷b=q1…r1我们当然也可以把上面这个式子改写成乘法式:a=bq1+r1------l)
如果r1=0,那么b就是a、b的最大公约数3。要是r1≠0,就继续除,用b除以r1,我们也可以有和上面一样的式子:
b=r1q2+r2-------2)
如果余数r2=0,那么r1就是所求的最大公约数3。为什么呢?因为如果2)式变成了b=r1q2,那么b1r1的公约数就一定是a1b的公约数。这是因为一个数能同时除尽b和r1,那么由l)式,就一定能整除a,从而也是a1b的公约数。
反过来,如果一个数d,能同时整除a1b,那么由1)式,也一定能整除r1,从而也有d是b1r1的公约数。
这样,a和b的公约数与b和r1的公约数完全一样,那么这两对的最大公约数也一定相同。那b1r1的最大公约数,在r1=0时,不就是r1吗?所以a和b的最大公约数也是r1了。
有人会说,那r2不等于0怎么办?那当然是继续往下做,用r1除以r2,……直到余数为零为止。
在这种方法里,先做除数的,后一步就成了被除数,这就是辗转相除法名字的来历吧。
⑻ 辗转相除法求最大公约数java
辗转相除法,是求两个正整数之最大公因子的算法。
辗转相除法的算法过程如下:设两数为a、b(a>b),求a和b最大公约数(a,b)的步骤如下:用a除以b,得
a÷b=q,余数r1(0≤r1)。若r1=0,则(a,b)=b;若r1不等于0,则再用b除以r1,得b÷r1=q,余数r2
(0≤r2).若r2=0,则(a,b)=r1,若r2不等于0,则继续用r1除以r2,如此下去,直到能整除为止,其最后一个为被除数的余数的除数即为
(a, b)。
具体事例代码如下:
public class Demo2 {
public static void main(String[] args) {
int a = 49,b = 91;
while(b != 0) {
int yushu = a % b; //记录余数
a = b; //将b值赋给a值
b = yushu; //将余数赋给b值
}
System.out.println(a);
}
}
辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。
⑼ 用Java语言求m,n的最大公约数,三种方法
1.从1开始循环。分别求出m、n的约数。找出最大公约数。
2.判断m、n的大小,从较小的开始循环,每次减一,判断是否为公约数。如果是,则为最大公约数,break;
3.2反过来,从小到大循环,找最大的。
公约数判断:
m%i=0&&n/i=0。
举第二个例子:
public class Test {
public static int getN(int m,int n){
int i = m>n?n:m;
for(;i>0;i--){
if(m%i==0&&n%i==0){
System.out.println("m、n的最大公约数为"+i);
break;
}
}
return i;
}
public static void main(String[] args) {
System.out.println(getN(100, 88));
}
}
⑽ java做二个数的最大公约数
1、欧几里德算法和扩展欧几里德算法
欧几里德算法
欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:
定理:gcd(a,b) = gcd(b,a mod b)
证明:a可以表示成a = kb + r,则r = a mod b
假设d是a,b的一个公约数,则有
d|a, d|b,而r = a - kb,因此d|r
因此d是(b,a mod b)的公约数
假设d 是(b,a mod b)的公约数,则
d | b , d |r ,但是a = kb +r
因此d也是(a,b)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证
欧几里德算法就是根据这个原理来做的,其算法用C++语言描述为:
void swap(int & a, int & b)
{
int c = a;
a = b;
b = c;
}
int gcd(int a,int b)
{
if(0 == a )
{
return b;
}
if( 0 == b)
{
return a;
}
if(a > b)
{
swap(a,b);
}
int c;
for(c = a % b ; c > 0 ; c = a % b)
{
a = b;
b = c;
}
return b;
}
2、Stein算法
欧几里德算法是计算两个数最大公约数的传统算法,他无论从理论还是从效率上都是很好的。但是他有一个致命的缺陷,这个缺陷只有在大素数时才会显现出来。
考虑现在的硬件平台,一般整数最多也就是64位,对于这样的整数,计算两个数之间的模是很简单的。对于字长为32位的平台,计算两个不超过32位的整数的模,只需要一个指令周期,而计算64位以下的整数模,也不过几个周期而已。但是对于更大的素数,这样的计算过程就不得不由用户来设计,为了计算两个超过64位的整数的模,用户也许不得不采用类似于多位数除法手算过程中的试商法,这个过程不但复杂,而且消耗了很多CPU时间。对于现代密码算法,要求计算128位以上的素数的情况比比皆是,设计这样的程序迫切希望能够抛弃除法和取模。
Stein算法由J. Stein 1961年提出,这个方法也是计算两个数的最大公约数。和欧几里德算法 算法不同的是,Stein算法只有整数的移位和加减法,这对于程序设计者是一个福音。
为了说明Stein算法的正确性,首先必须注意到以下结论:
gcd(a,a) = a,也就是一个数和他自身的公约数是其自身
gcd(ka,kb) = k gcd(a,b),也就是最大公约数运算和倍乘运算可以交换,特殊的,当k=2时,说明两个偶数的最大公约数必然能被2整除
C++/java 实现
// c++/java stein 算法
int gcd(int a,int b){
if(a<b)//arrange so that a>b{
int temp = a;
a = b;
b=temp;
}
if(0==b)//the base case
return a;
if(a%2==0 && b%2 ==0)//a and b are even
return 2*gcd(a/2,b/2);
if ( a%2 == 0)// only a is even
return gcd(a/2,b);
if ( b%2==0 )// only b is even
return gcd(a,b/2);
return gcd((a+b)/2,(a-b)/2);// a and b are odd
}