導航:首頁 > 源碼編譯 > java最大公約數演算法

java最大公約數演算法

發布時間:2022-08-16 10:22:48

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

}

閱讀全文

與java最大公約數演算法相關的資料

熱點內容
文件夾如何拖拽還保留原來的 瀏覽:21
職業生涯pdf 瀏覽:954
ubuntu安裝軟體php 瀏覽:159
黑馬程序員退學流程 瀏覽:362
網頁伺服器崩潰怎麼回事 瀏覽:651
cnc編程前景怎麼樣 瀏覽:320
lniux命令詳解 瀏覽:494
linuxmysql查詢日誌 瀏覽:369
老捷達夥伴壓縮比 瀏覽:94
改後綴加密 瀏覽:433
郵局選址問題演算法 瀏覽:15
河北伺服器內存雲主機 瀏覽:13
在電腦上怎麼找到加密狗圖標 瀏覽:437
電腦的瀏覽器怎麼打開pdf文件怎麼打開 瀏覽:145
pdf卡片庫下載 瀏覽:13
單片機中二進製表示什麼 瀏覽:726
java網路編程推薦 瀏覽:797
施耐德開關編程 瀏覽:68
組織胚胎學pdf 瀏覽:846
linux查看發包 瀏覽:497