最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言如何利用輾轉(zhuǎn)相除法求最大公約數(shù)

 更新時(shí)間:2023年08月10日 09:51:44   作者:Sandm *  
這篇文章主要介紹了C語言如何利用輾轉(zhuǎn)相除法求最大公約數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

C語言利用輾轉(zhuǎn)相除法求最大公約數(shù)

1. 首先要明確幾個(gè)概念

最大公約數(shù): 也叫最大公因數(shù),是指?jìng)z個(gè)或多個(gè)整數(shù)公有約數(shù)中最大的一個(gè)。

例如,18 和 24的最大公約數(shù)是 6

最小公倍數(shù):除0以外最小的一個(gè)公倍數(shù)就叫作這幾個(gè)整數(shù)的最小公倍數(shù)

例如,18 和 24的最小公倍數(shù)是 72

2. 輾轉(zhuǎn)相除法

用除數(shù)和余數(shù)反復(fù)做除法運(yùn)算,當(dāng)余數(shù)為0時(shí),取當(dāng)前算式除數(shù)為最大公約數(shù)

例如:求 1997 和 615 倆個(gè)正整數(shù)的最大公約數(shù)

因?yàn)椋?/p>

1997 % 615 = 152
615 % 152 = 7
152 % 7 = 5
7 % 5 = 2
5 % 2 = 1
2 % 1 = 0

所以,1997 和 615 的最大公約數(shù)為 1

3. C語言代碼實(shí)現(xiàn)

#include <stdio.h>
int main()
{
?? ?int data1 = 0, data2 = 0;
?? ?int m = 0; ? ? //該變量是中間變量,不能放在while函數(shù)的內(nèi)部
?? ?scanf_s("%d %d", &data1, &data2);
?? ?while ((m = data1 % data2) != 0)
?? ?{
?? ??? ?data1 = data2;
?? ??? ?data2 = m;
?? ?}
?? ?printf("最大公約數(shù)為%d\n", data2);
?? ?return 0;
}

注意點(diǎn):

對(duì)于求模運(yùn)算符%,若是分?jǐn)?shù)形式求余數(shù)的話,如果分子小于分母,則分子就是余數(shù)。

例如:2 % 5 = 0

而當(dāng)不是分?jǐn)?shù)形式求余數(shù)的話,即例如:18 % 24 時(shí),可將 % 左邊的內(nèi)容看成是分子,而 % 右邊的內(nèi)容看成是分母。所以 18 % 24 = 18

這里有一個(gè)誤區(qū),不能將18 與 24 在都約去 6 的情況下去求它們的余數(shù),所以 18 % 24(3 % 8)= 3 是錯(cuò)誤的

而不管是 18 % 24 ,還是24 % 18 。它們的余數(shù)均不會(huì)成為0

如果知道了倆個(gè)數(shù)的最大公約數(shù),那么其最小公倍數(shù)可以根據(jù)公式來確定

即最小公倍數(shù) = 倆個(gè)數(shù)的乘積 / 最大公約數(shù)

C語言求最大公約數(shù)常見思路

輾轉(zhuǎn)相除法

輾轉(zhuǎn)相除法又稱為歐幾里得算法,用于求兩數(shù)的最大公約數(shù)gcd(全稱為greatest common divisor)

注意兩數(shù)必須為非負(fù)整數(shù)a,b。用法為:用兩數(shù)中較大的數(shù)(a1)除以較小的數(shù)(b1),得到余數(shù)(r1),再用b1除以r1得到余數(shù)r2,之后再用r1除以r2,反復(fù)進(jìn)行,直到最后余數(shù)是0為止。最大公約數(shù)就是最后式子中的除數(shù)。

請(qǐng)看如下舉例:

 若用函數(shù)gcd(a,b)來表示,即gcd(a,b)=gcd(b,a%b),我們可以這樣理解:3887 2231和2231 1656的最大公約數(shù)是相等的,依次類推、重復(fù)操作。

用表達(dá)式可以這樣來表示:gcd(3887,2231)=gcd(2231,1656)=gcd(1656,575),直到最后到底gcd(a,b)=gcd(c,0),即gcd(3887,2231)=gcd(23,0)。

這里的c為a和b的最大公約數(shù)。

下面來看輾轉(zhuǎn)相除法的圖像說明

維基百科動(dòng)態(tài)圖

下面看算法實(shí)現(xiàn):

算法實(shí)現(xiàn)一

 

代碼中的a就相當(dāng)于上述gcd(a,b)=gcd(c,0)中的c。當(dāng)然還有利用此原理的其他寫法,不過是大同小異,這里就不一一列舉了。這里的if語句其實(shí)是多余的,因?yàn)橥ㄟ^輾轉(zhuǎn)相除完全可以實(shí)現(xiàn)兩數(shù)之間的互換。

算法實(shí)現(xiàn)二(函數(shù)遞歸法

 對(duì)輾轉(zhuǎn)相除足夠熟悉后,可以采用遞歸的方式,如算法實(shí)現(xiàn)三

算法實(shí)現(xiàn)三(遞歸思想)

總之一句話:除數(shù)除以余數(shù),直到余數(shù)為0為止。

更相減損之術(shù)

更相減損之術(shù)出自我國(guó)《九章算術(shù)》,原文是這樣的:

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

算法過程:大數(shù)減小數(shù),得到的差用來替換之前的大數(shù),如此反復(fù),直到得出來的差與上次的減數(shù)相等。此時(shí)的這個(gè)差就是兩者的最大公約數(shù)。

以 36 24為例(如下圖):

 可以這樣表示:gcd(36,24)=gcd(24,12),即36 24和24 12的最大公約數(shù)是相等的。

下面來看代碼實(shí)現(xiàn)

 總歸一句話:用大數(shù)減去小數(shù),知道減數(shù)和差相等。

最后,當(dāng)處理較大的數(shù)時(shí),輾轉(zhuǎn)相除法雖然在時(shí)間上有明顯優(yōu)勢(shì)。但是,即使是這樣,輾轉(zhuǎn)相除法也同樣存在缺陷,其在處理較大的素因數(shù)(也叫質(zhì)因數(shù),就是說一個(gè)數(shù)是另一個(gè)數(shù)的因數(shù),本身又是質(zhì)數(shù),就叫做另一個(gè)數(shù)的素因數(shù))時(shí),缺陷就會(huì)顯現(xiàn)出來。

當(dāng)然,實(shí)現(xiàn)求取最大公約數(shù)還有很多其他方法,這里只進(jìn)行了常見思路的講解。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺談C++ 容器查找效率

    淺談C++ 容器查找效率

    本文主要介紹了淺談C++ STL容器的查找效率差異,對(duì)比vector、list、set/map、unordered_set和deque等,幫助選擇合適容器以優(yōu)化性能,感興趣的可以了解一下
    2025-06-06
  • 詳解C++中賦值和輸入輸出語句的用法

    詳解C++中賦值和輸入輸出語句的用法

    這篇文章主要介紹了詳解C++中賦值和輸入輸出語句的用法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C++在多線程中使用condition_variable實(shí)現(xiàn)wait

    C++在多線程中使用condition_variable實(shí)現(xiàn)wait

    這篇文章主要介紹了C++中的condition_variable中在多線程中的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-09-09
  • opencv3/C++ PHash算法圖像檢索詳解

    opencv3/C++ PHash算法圖像檢索詳解

    今天小編就為大家分享一篇opencv3/C++ PHash算法圖像檢索詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • C語言智能指針之weak_ptr淺析

    C語言智能指針之weak_ptr淺析

    這篇文章主要介紹了 C++11智能指針之weak_ptr詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10
  • C++構(gòu)造函數(shù)的初始化列表詳解

    C++構(gòu)造函數(shù)的初始化列表詳解

    這篇文章主要為大家介紹了C++構(gòu)造函數(shù)的初始化列表,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • 淺談C++中派生類對(duì)象的內(nèi)存布局

    淺談C++中派生類對(duì)象的內(nèi)存布局

    下面小編就為大家?guī)硪黄獪\談C++中派生類對(duì)象的內(nèi)存布局。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • C 語言的 printf() 函數(shù)全面解析

    C 語言的 printf() 函數(shù)全面解析

    printf()用于格式化輸出到標(biāo)準(zhǔn)流,格式字符串包含轉(zhuǎn)換說明(如%d、%f)和修飾符(寬度、精度、對(duì)齊等),支持多種數(shù)據(jù)類型及選項(xiàng),但需注意類型轉(zhuǎn)換規(guī)則與常見錯(cuò)誤,如用%d輸出浮點(diǎn)數(shù)會(huì)導(dǎo)致錯(cuò)誤,本文給大家介紹C 語言的 printf() 函數(shù)的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2025-09-09
  • C++迭代器刪除元素避免索引混亂問題及分析

    C++迭代器刪除元素避免索引混亂問題及分析

    C++中刪除容器元素時(shí),索引操作易因內(nèi)存變化導(dǎo)致混亂,而迭代器通過動(dòng)態(tài)感知容器結(jié)構(gòu)變化,提供更安全的刪除方式,正確實(shí)踐是用erase()返回值更新迭代器,優(yōu)先使用remove_if算法,避免手動(dòng)調(diào)整索引,確保遍歷安全與代碼通用性
    2025-09-09
  • opencv實(shí)現(xiàn)圖形輪廓檢測(cè)

    opencv實(shí)現(xiàn)圖形輪廓檢測(cè)

    這篇文章主要為大家詳細(xì)介紹了opencv實(shí)現(xiàn)圖形輪廓檢測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04

最新評(píng)論

同德县| 旬阳县| 汾西县| 蓬莱市| 鹿邑县| 高密市| 双鸭山市| 郎溪县| 灯塔市| 黔东| 建水县| 廉江市| 兴宁市| 莒南县| 郎溪县| 噶尔县| 峡江县| 青铜峡市| 夹江县| 黑山县| 武宣县| 五指山市| 客服| 孟州市| 济阳县| 永平县| 东乌珠穆沁旗| 五河县| 贵定县| 朝阳县| 修武县| 安岳县| 石嘴山市| 东丰县| 淄博市| 石阡县| 和田市| 疏附县| 邯郸市| 额尔古纳市| 淮滨县|