更相減損法(求最大公約數)
演算法本質:
第一步:任意給定兩個正整數;判斷它們是否都是偶數。若是,則用2約簡;若不是則執行第二步。
第二步:以較大的數減較小的數,接著把所得的差與較小的數比較,並以大數減小數。繼續這個操作,直到所得的減數和差相等為止。
則第一步中約掉的若干個2的積與第二步中等數的乘積就是所求的最大公約數。
其中所說的“等數”,就是公約數。求“等數”的辦法是“更相減損”法。
#include<stdio.h>
int main()
{
int a, b;
int temp;
int num=0;
int t=0;
printf("請輸入兩個數:");
scanf_s("%d %d", &a, &b);
//兩個數一樣的情況下,最大公約數是他本身
if (a == b)
{
printf("%d", a);
}
else
{
//保證a是比b大的數
if (a < b)
{
temp = a;
a = b;
b = temp;
}
//當兩個數都是偶數的情況下,要先除2直到其中一個數不為偶數
while (a % 2 == 0 && b % 2 == 0)
{
a = a / 2;
b = b / 2;
num++;
}
//核心演算法,大數減去小數,一直到減數與差相等為止
while (a != b)
{
t = a - b;
if (t > b)
{
a = t;
b = b;
}
else
{
a = b;
b = t;
}
}
/*
//上面的另一種寫法
while (a != b)
{
if(a > b)a -= b else b -= a
}
*/
}
if (num != 0)
{
printf("最大公約數為:%d", t * 2 * num);//這裡要把兩個數都是偶數先約掉的2乘回來
}
else
{
printf("最大公約數為:%d", t);
}
return 0;
}
相關文章
- 更相減損法求最大公約數(Greatest Common Divisor)
- 更相減損術求解最大公約數
- 輾轉相除法與更相減損術(求最大公約數)
- C語言 用更相減損術求最大公約數,最小公倍數C語言
- 求最大公約數不同演算法的時間比較(輾轉相除法,更相減損術等)演算法
- 求最大公約數 & 最大公約數
- 求最大公約數 最簡手寫加STL
- 更相減損術的應用
- 求最大公約數(輾轉相除法)
- 求最大公公約數(最大公因數)—— 歐幾里得演算法演算法
- 證明:輾轉相除法與更相減損術
- 004 最大公約數
- 6-8 使用函式求最大公約數 (10分)函式
- C. 最大公約數
- 最大公約數,最小公倍數
- 最小公倍數&&最大公約數
- 演算法設計與分析:求兩個自然數的最大公約數演算法
- 最大公約數和最小公倍數
- 最小公倍數和最大公約數
- 連求最大公約數都不會,我怕不是上了個假大學
- 求兩個正整數的最大公約數與最小公倍數--C#實現C#
- python語言程式設計——求最大公約數和最小公倍數演算法Python程式設計演算法
- 約瑟夫環(約瑟夫問題)求最後出列的人數
- c語言遞迴函式實現求最大公約數(Euclid演算法)C語言遞迴函式演算法
- acwing246 區間最大公約數
- C++:最小公倍數與最大公約數C++
- 面試官:來寫個程式碼求一下兩個數的最大公約數吧面試
- 【數學問題】最大公約數與最小公倍數
- 用遞迴求出最大公約數和最小公倍數,求補充最小公倍數的遞迴用法遞迴
- 浮點數加減法
- 數學-錯位相減法
- P8792 [藍橋杯 2022 國 A] 最大公約數
- 篩選法求質數
- abc112D 和為定值時的最大公約數
- 最長公共子序列求方案數
- locust 執行一段時間,使用者數沒減少,但是 RPS 逐漸減少,最後沒有請求
- NumPy 差分、最小公倍數、最大公約數、三角函式詳解函式
- 相親原始碼開發,從程式碼級別減少資料請求次數的實現原始碼