国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

求最大公約數(shù)的幾種常見(jiàn)的方法 【詳解】

這篇具有很好參考價(jià)值的文章主要介紹了求最大公約數(shù)的幾種常見(jiàn)的方法 【詳解】。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

求最大公約數(shù)的幾種常見(jiàn)的方法 【詳解】,【C語(yǔ)言】,C語(yǔ)言,算法,最大公約數(shù)

目錄

一、關(guān)于公約數(shù)

二、計(jì)算最大公約數(shù)的方法?

1. 輾轉(zhuǎn)相除法(歐幾里得算法)

2. 更相減損法(輾轉(zhuǎn)相減法)

3. 分解質(zhì)因數(shù)法

4. 窮舉法?

5. 遞歸法

6. 短除法

三、總結(jié)


一、關(guān)于公約數(shù)

首先 ,先介紹一下公約數(shù):

公約數(shù)(公因數(shù)),一個(gè)能被若干個(gè)整數(shù)同時(shí)整除的的整數(shù),公約數(shù)中最大的稱為最大公約數(shù)。

公約數(shù)與公倍數(shù)相反,就是既是A的約數(shù)同時(shí)也是B的約數(shù)的數(shù),12和15的公約數(shù)有1,3,最大公約數(shù)就是3。再舉個(gè)例子,30和40,它們的公約數(shù)有1,2,5,10,最大公約數(shù)是10。

計(jì)算兩個(gè)數(shù)組的最大公約數(shù),例如計(jì)算 a,b兩個(gè)數(shù)的最大公約數(shù)。

二、計(jì)算最大公約數(shù)的方法?

1. 輾轉(zhuǎn)相除法(歐幾里得算法)

第一步,先是兩個(gè)數(shù)進(jìn)行 模運(yùn)算,來(lái)求余數(shù)???即 a%b

①當(dāng)a可以被b整除時(shí) (a%b == 0),直接返回 b , b就是最大公約數(shù)。例a = 4;b = 2;a%b==0,所以b = 2,就是這兩個(gè)數(shù)的最大公約數(shù)。

②當(dāng)a%b != 0時(shí),則進(jìn)行輾轉(zhuǎn)交換,這里用第三個(gè)變量來(lái)接收 c = a%b; 用 a 來(lái)接收 b的值,用b來(lái)接收c(余數(shù)的值)。

例 a = 6,b = 12;?c = a%b = 6;? ? a = b = 12;? b = c = 6;? a%b = 12%6 = 0。 最大公因數(shù)為 6。

共有約數(shù)中最大的一個(gè)

③重復(fù)上述①和②?

算法流程圖

求最大公約數(shù)的幾種常見(jiàn)的方法 【詳解】,【C語(yǔ)言】,C語(yǔ)言,算法,最大公約數(shù)

代碼展示?

//求最大公約數(shù)  輾轉(zhuǎn)相除法
#include <stdio.h>
int fun(int a,int b)
{
	while (a % b != 0)
	{
		int c = a % b;
		a = b;
		b = c;
	}
	return b;
}
int main() 
{
	int a = 0;
	int b = 0;
	scanf("%d %d",&a,&b);
	int ret = fun(a,b);
	printf("最大公約數(shù)為:%d",ret);
	return 0;
}

示例:

求最大公約數(shù)的幾種常見(jiàn)的方法 【詳解】,【C語(yǔ)言】,C語(yǔ)言,算法,最大公約數(shù)

2. 更相減損法(輾轉(zhuǎn)相減法)

更相減損術(shù)是出自《九章算術(shù)》的一種求最大公約數(shù)的算法,它原本是為約分而設(shè)計(jì)的,但它適用于任何需要求最大公約數(shù)的場(chǎng)合。

思想

原文是

可半者半之,不可半者,副置分母、子之?dāng)?shù),以少減多,更相減損,求其等也。以等數(shù)約之。

翻譯:

第一步:任意給定兩個(gè)正整數(shù);判斷它們是否都是偶數(shù)。若是,則用2約簡(jiǎn);

若不是則執(zhí)行第二步。

第二步:以較大的數(shù)減較小的數(shù),接著把所得的差與較小的數(shù)比較,并以大數(shù)減小數(shù)。繼續(xù)這個(gè)操作,直到所得的減數(shù)和差相等為止。

則第一步中約掉的若干個(gè)2的積與第二步中等數(shù)的乘積就是所求的最大公約數(shù)。

其中所說(shuō)的“等數(shù)”,就是公約數(shù)。求“等數(shù)”的辦法是“更相減損”法。

提取上述的一些思想

例 a = 12, b = 18;? b = b - a = 18 - 12 = 6; a >b; a = a - b = 12 - 6 = 6; a = b = 6; 。

算法流程圖
求最大公約數(shù)的幾種常見(jiàn)的方法 【詳解】,【C語(yǔ)言】,C語(yǔ)言,算法,最大公約數(shù)

代碼展示?

//更相減損法(輾轉(zhuǎn)相減法)
#include<stdio.h>
int main() 
{
	int a = 0;
	int b = 0;
	scanf("%d %d",&a,&b);
	while (a != b) 
	{
		if (a > b)
			a = a - b;
		else
			b = b - a;
	}
	printf("最大公約數(shù)是:%d",a);
	return 0;
}

示例

求最大公約數(shù)的幾種常見(jiàn)的方法 【詳解】,【C語(yǔ)言】,C語(yǔ)言,算法,最大公約數(shù)

3. 分解質(zhì)因數(shù)法

?把每個(gè)數(shù)分別分解質(zhì)因數(shù),再把各數(shù)中的全部公有質(zhì)因數(shù)提取出來(lái)連乘,所得的積就是這幾個(gè)數(shù)的最大公約數(shù)

例如:求24和60的最大公約數(shù),先分解質(zhì)因數(shù),得24=2×2×2×3,60=2×2×3×5,24與60的全部公有的質(zhì)因數(shù)是2、2、3,它們的積是2×2×3=12,所以,(24,60)= 12

求最大公約數(shù)的幾種常見(jiàn)的方法 【詳解】,【C語(yǔ)言】,C語(yǔ)言,算法,最大公約數(shù)

代碼展示

#include<stdio.h>
void fun(int * arr,int n)
{
	int i = 2, j = 0;
	while (n > 1)
	{
		if (n % i == 0)
		{
			arr[j++] = i;
			n /= i;
		}
		else 
		{
			i++;
		}
	}
}
int gcd(int a,int b) 
{
	//因?yàn)橐M(jìn)行找這個(gè)數(shù)的共有的因數(shù),所以這里用數(shù)組來(lái)接收
	int arr_a[100] = {0};//放a的所有因數(shù)
	int arr_b[100] = {0};//放b的所有因數(shù)
	//進(jìn)行放因數(shù)
	fun(arr_a,a);
	fun(arr_b,b);

	//找出公共的因數(shù),然后相乘
	int i = 0, j = 0, ret = 1;
	while (arr_a[i] != 0 && arr_b[j] != 0) 
	{
		if (arr_a[i] == arr_b[j]) 
		{
			ret *= arr_a[i];
			i++;
			j++;
		}
		else if (arr_a[i] > arr_b[j])
		{
			j++;
		}
		else
		{
			i++;
		}
	}
	return ret;
}
int main() 
{
	int a = 0;
	int b = 0;
	scanf("%d %d",&a,&b);
	int ret = gcd(a,b);//最大公因數(shù)
	printf("%d和%d的最大公因數(shù)是:%d",a,b,ret);
	return 0;
}

?求最大公約數(shù)的幾種常見(jiàn)的方法 【詳解】,【C語(yǔ)言】,C語(yǔ)言,算法,最大公約數(shù)

4. 窮舉法?

?窮舉法的基本思想是根據(jù)題目的部分條件確定答案的大致范圍,并在此范圍內(nèi)對(duì)所有可能的情況逐一驗(yàn)證,直到全部情況驗(yàn)證完畢。若某個(gè)情況驗(yàn)證符合題目的全部條件,則為本問(wèn)題的一個(gè)解;若全部情況驗(yàn)證后都不符合題目的全部條件,則本題無(wú)解。窮舉法也稱為枚舉法

這里的枚舉法就是 先?用一個(gè)臨時(shí)變量來(lái)接收(a或b) 其中的一個(gè)數(shù),然后連個(gè)數(shù)進(jìn)行模運(yùn)算,兩個(gè)數(shù)都模這個(gè)臨時(shí)變量等于零就是最大公約數(shù),否則臨時(shí)變量每次減一,然后重復(fù)上述。

代碼展示?

//窮舉法
#include<stdio.h>
int main() 
{
	int a = 0;
	int b = 0;
	scanf("%d %d",&a,&b);
	int t = a;
	while (t--)
	{
		if (a % t == 0 && b % t == 0)
			break;
	}
	printf("%d",t);
	return 0;
}

5. 遞歸法

這里的遞歸法是基于輾轉(zhuǎn)相除法的思想,然后通過(guò)遞歸來(lái)實(shí)現(xiàn)。

兩個(gè)數(shù)的最大公約數(shù) ,其中 較小的數(shù)? 和 兩個(gè)數(shù)相除的余數(shù) 的最大公約數(shù)

當(dāng) y / x%y == 0 時(shí) , y就是最大公約數(shù)。

不為0, 就遞歸 gcd(y,x%y),? gcd 下方代碼有描述

算法流程圖

求最大公約數(shù)的幾種常見(jiàn)的方法 【詳解】,【C語(yǔ)言】,C語(yǔ)言,算法,最大公約數(shù)

代碼實(shí)現(xiàn)?

#include<stdio.h>
int gcd(int a, int b)
{
	if (b == 0)
		return a;
	else
		return gcd(b,a%b);
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int ret = gcd(a,b);
	printf("%d",ret);
	return 0;
}

6. 短除法

例如:求12與18的最大公因數(shù)。以下如有約數(shù)出現(xiàn)則為因數(shù)

短除法例題:

12的因數(shù)有:1、2、3、4、6、12。

18的因數(shù)有:1、2、3、6、9、18。

12與18的公因數(shù)有:1、2、3、6。

12與18的最大公因數(shù)是6。

算法思想:

第一步:先是分別計(jì)算處兩個(gè)數(shù)的所有因數(shù),然后分別用數(shù)組來(lái)進(jìn)行存放兩個(gè)數(shù)組的所有因數(shù)(這里也可以只用一個(gè)數(shù)組)本例中為方便大家的理解采用兩個(gè)數(shù)組進(jìn)行存放。

注意:這里的存放也是有技巧的,這里采取的是從大到小進(jìn)行排序的(當(dāng)然也可以進(jìn)行采取從小到大進(jìn)行排序)

第二步:進(jìn)行遍歷找出相同的因數(shù)進(jìn)行比較,使用一個(gè)臨時(shí)變量用來(lái)存放最大公因數(shù)

?代碼展示

#include<stdio.h>
void fac(int* arr, int n)
{
	int i = 0;
	int j = 0;
	int k = 0;
	for (i = 1; i <= n; i++)
	{
		if (n % i == 0)
		{
			arr[k++] = i;
		}
	}
}
int gcd(int a, int b)
{
	int arr1[100] = { 0 };
	int arr2[100] = { 0 };
	fac(arr1, a);
	fac(arr2, b);

	//求同找最大
	int i = 0, j = 0, max = 1;
	while (arr1[i] != 0 && arr2[j] != 0)
	{
		if (arr1[i] == arr2[j])
		{
			if (max < arr1[i])
			{
				max = arr1[i];
			}
			i++;
			j++;
		}
		else if (arr1[i] < arr2[j])
		{
			i++;
		}
		else
		{
			j++;
		}
	}
	return max;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int ret = gcd(a, b);
	printf("%d 和 %d 的最大公因數(shù)為 %d",a,b ,ret);
	return 0;
}

求最大公約數(shù)的幾種常見(jiàn)的方法 【詳解】,【C語(yǔ)言】,C語(yǔ)言,算法,最大公約數(shù)

三、總結(jié)

這里比較推薦是用 輾轉(zhuǎn)相除法(歐幾里得算法)和 《九章算術(shù)》中的 更相減損法

多說(shuō)一下,因?yàn)楫?dāng)時(shí)阿明淺淺學(xué)過(guò)遍輾轉(zhuǎn)相除法,然后不久后就忘干凈了,用的時(shí)候還要再去反復(fù)找,為了方便使用,干脆把 求解最大公約數(shù) 的幾種常見(jiàn)的方法詳細(xì)介紹一下,雖然不是最好,但是多少希望對(duì)大家有些幫助!

希望大家對(duì)這些方法,有更加深刻的印象。

求最大公約數(shù)的幾種常見(jiàn)的方法 【詳解】,【C語(yǔ)言】,C語(yǔ)言,算法,最大公約數(shù)

加油?。?!?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-720321.html

到了這里,關(guān)于求最大公約數(shù)的幾種常見(jiàn)的方法 【詳解】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C++求最大公約數(shù)和最小公倍數(shù)的方法

    每次遇到最大公約數(shù)和最小公倍數(shù)時(shí)總是忘記,這里總結(jié)了兩種求最大公約數(shù)和最小公倍數(shù)的方法。 歐幾里得算法是求解兩個(gè)數(shù)的最大公約數(shù)的一種常用方法。該算法基于以下原理:兩個(gè)整數(shù)的最大公約數(shù)等于其中較小數(shù)和兩數(shù)的余數(shù)之間的最大公約數(shù)。可以通過(guò)遞歸調(diào)用該

    2024年02月15日
    瀏覽(25)
  • 【c語(yǔ)言】—求最大公約數(shù)和最小公倍數(shù)多種方法

    目錄 一.求最大公約數(shù) 1.枚舉法求最大公約數(shù) 2.輾轉(zhuǎn)相除法 二.求最小公倍數(shù) 1.枚舉法求最小公倍數(shù) 2.簡(jiǎn)易法 3.公式法 思路:先求兩個(gè)數(shù)中的最小值,最大公約數(shù)不可能大于兩個(gè)數(shù)的最小數(shù) 比如6和18,最大公約數(shù)就是6 再如3和9,最大公約數(shù)就是3 然后再?gòu)?開(kāi)始循環(huán)遍歷到最小

    2024年02月08日
    瀏覽(22)
  • C語(yǔ)言入門(mén)——求最大公約數(shù)(2種方法超詳細(xì))

    C語(yǔ)言入門(mén)——求最大公約數(shù)(2種方法超詳細(xì))

    基本介紹: 最大公約數(shù)(greatest common divisor,簡(jiǎn)寫(xiě)為 gcd ;或highest common factor,簡(jiǎn)寫(xiě)為hcf),指某幾個(gè)整數(shù)共有因子中最大的一個(gè)。 最大公約數(shù) 能夠整除一個(gè)整數(shù)的整數(shù)稱為其的約數(shù)(如5是10約數(shù)); 能夠被一個(gè)整數(shù)整除的整數(shù)稱為其的倍數(shù)(如10是5的倍數(shù)); 如果一個(gè)數(shù)既

    2024年02月08日
    瀏覽(18)
  • 你會(huì)求兩個(gè)數(shù)的最大公約數(shù)嗎(三種方法)?

    你會(huì)求兩個(gè)數(shù)的最大公約數(shù)嗎(三種方法)?

    目錄 前言 一、枚舉法 二、輾轉(zhuǎn)相除法 三、更相減損法 如何求兩個(gè)數(shù)的最大公約數(shù)是非常經(jīng)典的問(wèn)題,求解的方法也有很多,本文主要介紹其中的三種方法,分別是: 枚舉法、輾轉(zhuǎn)相除法和更相減損法 。 ? 兩個(gè)數(shù)的最大公約數(shù)一定小于或等于兩數(shù)中較小的數(shù),并且這兩個(gè)

    2023年04月08日
    瀏覽(24)
  • 【約數(shù)】求最大公約數(shù)——遞歸

    請(qǐng)使用遞歸算法計(jì)算正整數(shù)n和m的最大公約數(shù)GCD(n,m)。 G C D ( n , m ) = { = m , 當(dāng) m = n 且 n m o d m = 0 = G C D ( m , n ) , 當(dāng) n m 時(shí) = G C D ( m , n m o d ?? m ) , 其他 GCD(n,m)=left{begin{matrix} =m,當(dāng) m=n 且 n mod m =0\\\\ =GCD(m,n),當(dāng)nm時(shí)\\\\ =GCD(m,n mod m),其他 end{matrix}right. GC D ( n , m ) = ? ? ? ? = m

    2024年02月03日
    瀏覽(18)
  • 輾轉(zhuǎn)相除法求最大公約數(shù)

    輾轉(zhuǎn)相除法求最大公約數(shù)

    輾轉(zhuǎn)相除法也被稱為歐幾里得算法,是求兩個(gè)整數(shù)的最大公約數(shù)(GCD)的一種常用方法。 輾轉(zhuǎn)相除法的原理是基于兩個(gè)整數(shù)的最大公約數(shù)與它們的余數(shù)的最大公約數(shù)相等的性質(zhì)。具體步驟如下: 用較大的數(shù)除以較小的數(shù),得到一個(gè)商和余數(shù)。 如果余數(shù)為0,則較小的數(shù)即為最

    2024年02月05日
    瀏覽(25)
  • 最大公約數(shù)和最小公倍數(shù)問(wèn)題

    等差數(shù)列 藍(lán)橋杯192 gcd問(wèn)題 題目描述 數(shù)學(xué)老師給小明出了一道等差數(shù)列求和的題目。但是粗心的小明忘記了一 部分的數(shù)列,只記得其中?N?個(gè)整數(shù)。 現(xiàn)在給出這?N?個(gè)整數(shù),小明想知道包含這?N?個(gè)整數(shù)的最短的等差數(shù)列有幾項(xiàng)? 思路:求出每一項(xiàng)之差的最大公約數(shù),以這個(gè)

    2023年04月09日
    瀏覽(26)
  • C++ 最大公約數(shù)與最小公倍數(shù)

    C++ 最大公約數(shù)與最小公倍數(shù)

    (一)簡(jiǎn)單的兩個(gè)正整數(shù)? 求 最大公約數(shù) (引入專題) 思路: 根據(jù) “歐幾里得算法”? ,即 “輾轉(zhuǎn)相除法” 原理如下: 題意: 求出? ?a? , b? 兩個(gè)正整數(shù)的最大公約數(shù) 設(shè)? k = a / b,? ?r = a % b 即? ? a = k * b + r 又設(shè)? d? 為 a 和 b 的一個(gè)公約數(shù) 那么由? r = a - k * b,? 可

    2024年02月06日
    瀏覽(21)
  • 【算法】輾轉(zhuǎn)相除法求最大公約數(shù)

    輾轉(zhuǎn)相除法 ,又稱 歐幾里德算法(Euclidean Algorithm) ,是求兩個(gè)數(shù)的 最大公約數(shù)(greatest?common?divisor) 的一種方法。用較大的數(shù)除以較小的數(shù),再以除數(shù)和余數(shù)反復(fù)做除法運(yùn)算,當(dāng)余數(shù)為0時(shí),取當(dāng)前算式除數(shù)為最大公約數(shù)。 求30和18的最大公約數(shù): 30 /? 18? = 1 余? 12 18?

    2024年02月14日
    瀏覽(17)
  • C語(yǔ)言—最大公約數(shù)和最小公倍數(shù)

    C語(yǔ)言—最大公約數(shù)和最小公倍數(shù)

    作者主頁(yè): paper jie的博客_CSDN博客-C語(yǔ)言,算法詳解領(lǐng)域博主 本文作者: 大家好,我是paper jie,感謝你閱讀本文,歡迎一建三連哦。 本文錄入于 《算法詳解》專欄,本專欄是針對(duì)于大學(xué)生,編程小白精心打造的。筆者用重金(時(shí)間和精力)打造,將算法基礎(chǔ)知識(shí)一網(wǎng)打盡,希望

    2024年02月13日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包