更相減損法(求最大公約數)

Am_TY發表於2021-05-19

演算法本質:

第一步:任意給定兩個正整數;判斷它們是否都是偶數。若是,則用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;
}

相關文章