C語言三種算法求解最大公約數與最小公倍數

C語言三種算法求解最大公約數與最小公倍數

最大公約數與最小公倍數的求解是很多初學C的人所面臨的一道問題。當然這道問題並不難解答,也有很多人已經寫過相關的博客,我在此書寫此篇博客,一是爲了讓自己能夠夯實基礎,另外就是希望能夠幫到和我一樣的初學者。

當然,在寫這篇博客之前,我已經做過相關資料的調查,可能讀者會發現此篇博客會與其他人的博客有所重複,但是,我保證絕未抄襲。好了,進入正題!

問題:請從鍵盤上輸入兩個數值 x,y,請用C語言求出這兩個數值的最大公約數與最小公倍數。

首先,我們要想解決這道問題,就要了解什麼是最大公約數與最小公倍數。

最大公因數;也稱最大公約數、最大公因子,指兩個或多個整數共有約數中最大的一個。----來源百度百科

最小公倍數:兩個或多個整數公有的倍數叫做它們的公倍數。----來源百度百科

瞭解了其含義,接下來就是構思算法,通常而言,求解最大公約數有三種算法,而最小公倍數的求解,我們可以很容易的推斷出,最小公倍數等於兩個數值的乘積除以這兩個數值的最大公約數。那麼接下來的算法我將在此一一進行列舉和解釋。

1.輾轉相除法 

又名歐幾里德算法(Euclidean algorithm),它是已知最古老的算法, 其可追溯至公元前300年前。 ----來源百度百科

輾轉:望文生義,就是翻來覆去。相除就很好理解了,就是進行除法運算。

輾轉相除法的核心就是不斷的讓兩個數做除法運算。其原理基於兩個整數的最大公約數等於其中較小的數和兩數的相除餘數的最大公約數。

假設兩數爲 x,y。

先令 z = x % y ;

之後 y 賦給 x 即令  x = y ;

再將 z 賦給 y 即令  y = z;

輾轉相減,其終止條件爲:y 等於0時。 

代碼如下:

#include<stdio.h>
int main()
{
	int x, y, z, m, n;
	printf("請輸入兩個數:");
	scanf_s("%d%d", &x, &y);
	m = x, n = y;
	while (y != 0)
	{
		z = x%y;
		x = y;
		y = z;
	}
	printf("最大公約數是: %d\n", x);
	printf("最小公倍數是: %d\n", m*n / x);
	system("pause");
	return 0;
}


2.輾轉相減法

尼考曼徹斯法,其特色是做一系列減法,從而求得最大公約數。----來源百度百科

輾轉相減法即通過對兩數的不斷減法運算。

假設兩數爲 x, y。

當 x > y 時,令 x = x - y;

反之,則令 y = y - x;

之後一直輾轉相減,直至 x = y 時,終止。

代碼如下:

#include<stdio.h>
int main()
{
	int x, y, m, n;
	printf("請輸入兩個數:");
	scanf_s("%d%d", &x, &y);
	m = x, n = y;
	while (x!=y)
	{
		if (x>y)
			x = x-y;
		else
			y = y-x;
	}
	printf("最大公約數是: %d\n", x);
	printf("最小公倍數是: %d\n", m*n / x);
	system("pause");
	return 0;
}

3.窮舉法:

窮舉法的基本思想是根據題目的部分條件確定答案的大致範圍,並在此範圍內對所有可能的情況逐一驗證,直到全部情況驗證完畢。----來源百度百科

窮舉法又稱枚舉法,通過對數值範圍內的所有數字進行檢驗,得出其結果。

代碼如下:

#include<stdio.h>
int main()
{
	int x, y, i, m, n;
	printf("請輸入兩個數:");
	scanf_s("%d%d", &x, &y);
	m = x, n = y;
	for (i = 1; i <= x; i++)
	{
		if (x%i == 0 && y%i == 0)
			break;
	}
	for (i = x; i > 0; i--)
	{
		if (x%i == 0 && y%i == 0)
			break;
	}
	printf("最大公約數是: %d\n", i);
	printf("最小公倍數是: %d\n", m*n / i);
	system("pause");
	return 0;
}


以上即爲求解最大公約數與最小公倍數的三種算法,如有紕漏,還請各位不吝賜教。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章