小朋友學(xué)編程—求最大公約數(shù)

一锅棕、最大公約數(shù)(Greatest Common Divisor)

幾個自然數(shù),公有的因數(shù)淌山,叫做這幾個數(shù)的公約數(shù)裸燎;其中最大的一個,叫做這幾個數(shù)的最大公約數(shù)泼疑。例如:18德绿、12的公約數(shù)有1、2退渗、3移稳、6,其中最大的一個是6会油,6是18與12的最大公約數(shù)个粱,一般記為(18、12)=6钞啸。

二几蜻、編程求最大公約數(shù)

用c++編程實現(xiàn)喇潘,輸入任意兩個自然數(shù)a和b,求他們的最大公約數(shù)梭稚。
這個題目主要是考察小朋友們對循環(huán)的使用颖低。

三、算法求解

1.窮舉法

解析

窮舉法是大部分人最先想到的方法弧烤。讓一個數(shù)循環(huán)的去被a和b除忱屑,如果余數(shù)都為0那么就是他們的公約數(shù),然后最大的那個就是最大公約數(shù)暇昂。

代碼

#include <iostream>
using namespace std;

//窮舉法
int gcd1(int a, int b)
{
    int x=(a<b?a:b);
    int z = 0 ,count=0;
    for(;x>0;x--)
    {
        if( a%x == 0 && b%x == 0 ){
            z=x;
            break;
        }
        count++;
    }
    cout<<"循環(huán)次數(shù)(窮舉法):"<<count<<endl;
    return z;
}

int main(){
    int a,b,result;
    cin>>a>>b;
    result = gcd1(a,b);
    cout<<a<<"和"<<b<<"的最大公約數(shù):"<<result<<endl;
    return 0;
}

運行結(jié)果:

18 12
循環(huán)次數(shù)(窮舉法):6
18和12的最大公約數(shù):6

分析

窮舉法雖然簡單莺戒,但是有一個很大的缺點,就是效率低急波。比如咱們輸入1200和1800从铲,那么程序是從1200開始自減,一直減到600澄暮,才得出了結(jié)果名段。這個過程for共執(zhí)行了600次。含有很多小朋友會從1開始寫自增泣懊,那么循環(huán)的次數(shù)就更多了伸辟。
所以求最大公約數(shù),通常不用窮舉法馍刮。
窮舉法的效率極其的低下信夫,和后面其他幾個不在一個數(shù)量級上。

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

解析

輾轉(zhuǎn)相除法卡啰,又稱歐幾里得算法静稻。用于計算兩個正整數(shù)a,b的最大公約數(shù)和最小公倍數(shù)碎乃,其依賴于gcd(a,b) = a (b=0)和gcd(b,a mod b) (b!=0)姊扔。算法的具體描述如下圖:


輾轉(zhuǎn)相除法圖示

代碼

#include <iostream>
using namespace std;

//迭代相除法
int gcd2(int a, int b)
{
    int z = b;
    int count = 0;
    while (a % b != 0) {
        z = a % b;
        a = b;
        b = z;
        count++;
    }
    cout<<"循環(huán)次數(shù)(迭代相除):"<<count<<endl;
    return z;
}

int main(){
    int a,b,result;
    cin>>a>>b;
    result = gcd2(a,b);
    cout<<a<<"和"<<b<<"的最大公約數(shù):"<<result<<endl;
    return 0;
}

運行結(jié)果:

18 12
循環(huán)次數(shù)(迭代相除):1
18和12的最大公約數(shù):6

分析

可以看到迭代相除只用了一次循環(huán)就得到了結(jié)果,大大提高了效率梅誓。
此方法當數(shù)據(jù)較小的時候性能最好恰梢,代碼可讀性極好,但是它需要用到取余運算.

擴展

小朋友們只學(xué)到了循環(huán)梗掰,如果學(xué)到函數(shù)以及遞歸則可以把函數(shù)寫成如下這樣嵌言,大大簡化代碼提高可讀性。

int gcd(int a, int b)
{
    return 0 == b ? a : gcd(b, a % b);
}

3.更相減損法

解析

更相減損術(shù)是出自《九章算術(shù)》的一種求最大公約數(shù)的算法及穗,它原本是為約分而設(shè)計的摧茴,但它適用于任何需要求最大公約數(shù)的場合。
九章算術(shù)》是中國古代的數(shù)學(xué)專著埂陆,其中的“更相減損術(shù)”可以用來求兩個數(shù)的最大公約數(shù)苛白,原文是:
可半者半之娃豹,不可半者,副置分母购裙、子之數(shù)懂版,以少減多,更相減損躏率,求其等也躯畴。以等數(shù)約之蜡励。
白話文譯文:
(如果需要對分數(shù)進行約分痘拆,那么)可以折半的話得封,就折半(也就是用2來約分)最冰。如果不可以折半的話,那么就比較分母和分子的大小饱岸,用大數(shù)減去小數(shù)屡久,互相減來減去纤怒,一直到減數(shù)與差相等為止黄娘,用這個相等的數(shù)字來約分峭状。
算法的圖示如下:

更相減損法

代碼

#include <iostream>
using namespace std;

//更相減損法
int gcd3(int a,int b)
{
    int count = 0;
    while(a != b)
    {
        if(a>b)
        {
            a = a - b;
        }
        else
        {
            b = b - a;
        }
        count++;
    }
    cout<<"循環(huán)次數(shù)(更相減損法):"<<count<<endl;
    return a;
}

int main(){
    int a,b,result;
    cin>>a>>b;
    result = gcd3(a,b);
    cout<<a<<"和"<<b<<"的最大公約數(shù):"<<result<<endl;
    return 0;
}

運行結(jié)果:

18 12
循環(huán)次數(shù)(更相減損法):2
18和12的最大公約數(shù):6

分析

可以看到更相減損法用了兩次循環(huán)得到結(jié)果克滴,效率也挺高逼争,還有它不需要取余。
這種方法在計算大數(shù)的情況下依舊可以保持較快的速度劝赔,代碼的可讀性也非常高誓焦,但是因為要不斷互減,在兩個數(shù)較為接近的時候需要的系統(tǒng)資源較大。

4.短除法

解析

短除法應(yīng)該是小朋友最熟悉的數(shù)學(xué)方法着帽,和計算數(shù)學(xué)題時常采用的方法一致杂伟。


短除法

左邊部分的因子相乘,即為最大公約數(shù)仍翰。
所以赫粥,18與12的最大公約數(shù)為2 * 3 = 6

// 短除法
int gcd4(int a, int b)
{
    int min = a < b ? a : b;
    int s = 1;
    int i;
    for(i = 2; i <= min ; i++)
    {
        // 四個條件只要有一個不滿足,while循環(huán)結(jié)束
        while(a > 0 && b > 0 && 0 == a % i && 0 == b % i)
        {
            a /= i;
            b /= i;
            s *= i;
        }
    }
    return s;
}

int main(){
    int a,b,result;
    cin>>a>>b;
    result = gcd4(a,b);
    cout<<a<<"和"<<b<<"的最大公約數(shù):"<<result<<endl;
    return 0;
}

分析

短除法的效率也還算可以予借,它更多是和我們常用的數(shù)學(xué)方法一致越平,算法上比較容易理解,但是代碼的可讀性就比較差一些灵迫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秦叛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瀑粥,更是在濱河造成了極大的恐慌挣跋,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狞换,死亡現(xiàn)場離奇詭異避咆,居然都是意外死亡舟肉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門查库,熙熙樓的掌柜王于貴愁眉苦臉地迎上來度气,“玉大人,你說我怎么就攤上這事膨报×准” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵现柠,是天一觀的道長院领。 經(jīng)常有香客問我,道長够吩,這世上最難降的妖魔是什么比然? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮周循,結(jié)果婚禮上强法,老公的妹妹穿的比我還像新娘。我一直安慰自己湾笛,他們只是感情好饮怯,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嚎研,像睡著了一般蓖墅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上临扮,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天论矾,我揣著相機與錄音,去河邊找鬼杆勇。 笑死贪壳,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蚜退。 我是一名探鬼主播闰靴,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼关霸!你這毒婦竟也來了传黄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤队寇,失蹤者是張志新(化名)和其女友劉穎膘掰,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡识埋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年凡伊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窒舟。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡系忙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惠豺,到底是詐尸還是另有隱情银还,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布洁墙,位于F島的核電站蛹疯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏热监。R本人自食惡果不足惜捺弦,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望孝扛。 院中可真熱鬧列吼,春花似錦、人聲如沸苦始。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盈简。三九已至凑耻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柠贤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工类缤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留臼勉,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓餐弱,卻偏偏與公主長得像宴霸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子膏蚓,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容