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

C語言求兩個正整數(shù)的最大公約數(shù)示例代碼

 更新時間:2021年12月12日 11:55:18   作者:Tkpluto  
在C語言中求兩個數(shù)的最大公約數(shù)是學習循環(huán)語句的非常經(jīng)典的問題,下面這篇文章主要給大家介紹了關(guān)于C語言求兩個正整數(shù)的最大公約數(shù)的相關(guān)資料,需要的朋友可以參考下

前言

兩個正整數(shù)的最大公約數(shù)(Greatest Common Divisor, GCD)是能夠整除這兩個整數(shù)的最大整數(shù)。兩個正整數(shù)的最大公約數(shù)的求法有多種解答,本文就三種方法做詳細介紹:窮舉法、歐幾里得算法(輾轉(zhuǎn)相除法)、遞歸方法。

我們從一道問題來引入:編寫計算最大公約數(shù)的函數(shù)Gcd(),在主函數(shù)中調(diào)用該函數(shù)計算并輸出從鍵盤任意輸入的最大公約數(shù)。

1.窮舉法

根據(jù)最大公約數(shù)的定義,我們可以采用一種最簡單的方法——窮舉法來編寫代碼。由于a和b的最大公約數(shù)不可能比a和b中的較小者還大,否則一定不能整除它,因此,先找到a和b中的較小者t,然后從t開始逐次減1嘗試每種可能,即檢驗t到1之間的所有整數(shù),第一個滿足公約數(shù)條件的t,就是a和b的最大公約數(shù)。據(jù)此我們可編寫函數(shù)Gcd()如下:

//函數(shù)功能:計算a和b的最大公約數(shù),輸入負數(shù)時返回-1
int Gcd(int a, int b)
{
    int i, t;
    if (a <=0 || b <= 0)
        return -1;
    t = a < b ? a : b;
    for (i=t; i>0; i--)
    {
        if (a%i==0 && b%i==0)
            return i;
    }
    return 1;
}

這種方法簡單暴力,思維量小,但效率較低,且當兩個正整數(shù)都較大,且最大公約數(shù)為1時,循環(huán)的次數(shù)為較小數(shù)的值,可想而知所需時間會很長。

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

下面介紹一種求最大公約數(shù)較常用的辦法:歐幾里得算法(輾轉(zhuǎn)相除法)。

忽略數(shù)學原理,我們有如下算法:對正整數(shù)a和b,連續(xù)進行求余運算,直到余數(shù)為0為止,此時非0的除數(shù)就是最大公約數(shù)。設(shè) r=a mod b 表示a除以b的余數(shù),若 r≠0 ,則將b作為新的a,r作為新的b,重復 a mod b 運算,直到 r=0 為止,此時b為所求的最大公約數(shù)。例如,50和15的最大公約數(shù)的求解過程可表示為:Gcd(50, 15)=Gcd(15, 5)=Gcd(5, 0)=5。

用這種算法可編寫函數(shù)Gcd()如下:

//函數(shù)功能:計算a和b的最大公約數(shù),輸入負數(shù)時返回-1
int Gcd(int a, int b)
{
    int r;
    if (a <= 0 || b <= 0)
        return -1;
    do{
        r = a % b;
        a = b;
        b = r;
    } while (r != 0);
    return a;
}

我們也可以考慮使用遞歸實現(xiàn)如下:

//函數(shù)功能:計算a和b的最大公約數(shù),輸入負數(shù)時返回-1
int Gcd(int a, int b)
{
    if (a <= 0 || b <= 0)
        return -1;
    if (a % b == 0)
        return b;
    else
        return Gcd(b, a % b);
}

3.遞歸方法

對于最大公約數(shù),還有3條性質(zhì):

性質(zhì)1 如果 a>b,則a和b與a-b和b的最大公約數(shù)相同;

性質(zhì)2 如果 b>a,則a和b與a和b-a的最大公約數(shù)相同;

性質(zhì)3 如果 a=b,則a和b的最大公約數(shù)與a值和b值相同。

對正整數(shù)a和b,當 a>b 時,若a中含有與b相同的公約數(shù),則a中去掉b后剩余的部分a-b中也應含有與b相同的公約數(shù),對a-b和b計算公約數(shù)就相當于對a和b計算公約數(shù)。反復使用最大公約數(shù)的3條性質(zhì),直到a和b相等為止,這時,a或b就是它們的最大公約數(shù)。

這就是所謂的第三種方法:遞歸方法。雖然此法被稱為遞歸方法,但只是思想方法運用了遞歸的方法,并不代表只能使用遞歸實現(xiàn)。我們同樣可以通過非遞歸和遞歸兩種手段編寫函數(shù)Gcd()。非遞歸實現(xiàn)如下:

//函數(shù)功能:計算a和b的最大公約數(shù),輸入負數(shù)時返回-1
int Gcd(int a, int b)
{
    if (a <= 0 || b <= 0)
        return -1;
    while (a != b)
    {
        if (a > b)
            a = a - b;
        else if (b > a)
            b = b - a;
    }
    return a;
}

編寫遞歸函數(shù)如下:

//函數(shù)功能:計算a和b的最大公約數(shù),輸入負數(shù)時返回-1
int Gcd(int a, int b)
{
    if (a <= 0 || b <= 0)
        return -1;
    if (a == b)
        return a;
    else if (a > b)
        return Gcd(a-b, b);
    else
        return Gcd(a, b-a);
}

以上就是三種計算最大公約數(shù)的算法,可使用如下主函數(shù)來調(diào)用函數(shù)Gcd(),計算最大公約數(shù):

#include <stdio.h>
int Gcd(int a, int b);
int main(void)
{
    int a, b, c;
    printf("Input a,b:");
    scanf("%d,%d", &a, &b);
    c = Gcd(a,b);
    if (c != -1)
        printf("Greatest Common Divisor of %d and %d is %d\n", a, b, c);
    else
        printf("Input number should be positive!\n");
    return 0;
}

求兩個正整數(shù)的最大公約數(shù)的過程,實質(zhì)上是使用最大公約數(shù)的定義及性質(zhì)求解的過程,對此感興趣的伙伴們可以自己研究相關(guān)數(shù)學原理與證明。

附:相減法

這種方法比較易于理解,原理是先判斷兩個正整數(shù)大小,并將較大數(shù)與較小數(shù)的差值賦給較大數(shù),循環(huán)此步驟直到兩數(shù)相等,此時得出最大公約數(shù)。

代碼如下:

#include<stdio.h>

int main()

{

	int m,n;

	printf("請輸入兩個正整數(shù):");

	scanf("%d %d",&m,&n);

	printf("%d%和%d的最大公約數(shù)是",m,n);

    while(m!=n)

	{

		if(m>n)

		{

			m=m-n;

		}else

		{

			n=n-m;

		}	

	}

	printf("%d",n);

	return 0;

} 

參考文獻:

蘇小紅 王甜甜 趙玲玲 范江波 車萬翔 等編著 王宇穎 主審,C語言程序設(shè)計學習指導(第4版),高等教育出版社,P57-60.

總結(jié)

到此這篇關(guān)于C語言求兩個正整數(shù)的最大公約數(shù)的文章就介紹到這了,更多相關(guān)C語言兩正整數(shù)最大公約數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于c++編譯protobuf時提示LNK2001 無法解析的外部符號的問題

    關(guān)于c++編譯protobuf時提示LNK2001 無法解析的外部符號的問題

    這篇文章主要介紹了關(guān)于c++編譯protobuf時提示LNK2001 無法解析的外部符號的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • C++實現(xiàn)快捷店會員管理系統(tǒng)

    C++實現(xiàn)快捷店會員管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)快捷店會員管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C 語言插入排序算法及實例代碼

    C 語言插入排序算法及實例代碼

    本文主要介紹C語言插入排序,這里給大家詳細介紹插入排序的思想并舉例說明,還有實現(xiàn)代碼,有需要的朋友可以參考下
    2016-07-07
  • Linux下動靜態(tài)庫的打包與使用指南(C/C++)

    Linux下動靜態(tài)庫的打包與使用指南(C/C++)

    c++是面向?qū)ο蟮木幊陶Z言,比較方便實現(xiàn)某些第三方庫,比如翻譯其他面向?qū)ο笳Z言的代碼,比c語言要方便的多,下面這篇文章主要給大家介紹了關(guān)于Linux下C/C++動靜態(tài)庫的打包與使用的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • C++中的Reactor原理與實現(xiàn)

    C++中的Reactor原理與實現(xiàn)

    reactor設(shè)計模式是event-driven?architecture的一種實現(xiàn)方式,處理多個客戶端并發(fā)的向服務端請求服務的場景,每種服務在服務端可能由多個方法組成,這篇文章主要介紹了Reactor原理與實現(xiàn),需要的朋友可以參考下
    2022-07-07
  • Qt自制一個小鬧鐘的實現(xiàn)示例

    Qt自制一個小鬧鐘的實現(xiàn)示例

    本文主要介紹了Qt自制一個小鬧鐘的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-09-09
  • 淺析char 指針變量char *=p 這個語句的輸出問題

    淺析char 指針變量char *=p 這個語句的輸出問題

    下面小編就為大家?guī)硪黄獪\析char 指針變量char *=p 這個語句的輸出問題。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • 深入了解C語言中的動態(tài)內(nèi)存分配

    深入了解C語言中的動態(tài)內(nèi)存分配

    這篇文章主要為大家詳細介紹了C語言中的動態(tài)內(nèi)存分配,文中的示例代碼講解詳細,對我們學習C語言有一定的幫助,需要的可以參考一下
    2022-06-06
  • C# CLR 中學習 C++關(guān)鍵詞extern使用詳解

    C# CLR 中學習 C++關(guān)鍵詞extern使用詳解

    這篇文章主要為大家介紹了C# CLR 中學習 C++ 之extern使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • 基于opencv實現(xiàn)視頻中的顏色識別功能

    基于opencv實現(xiàn)視頻中的顏色識別功能

    這篇文章主要介紹了基于opencv實現(xiàn)視頻中的顏色識別功能,文章詳細介紹了顏色識別的原理及opencv中的顏色模型,基于c++代碼實現(xiàn)顏色識別功能,需要的朋友可以參考下
    2022-07-07

最新評論

开原市| 武平县| 孟村| 辉南县| 岑溪市| 绥芬河市| 海宁市| 泌阳县| 乌恰县| 海安县| 武宁县| 天峨县| 砚山县| 图们市| 奉化市| 松江区| 柳河县| 逊克县| 渝中区| 改则县| 克拉玛依市| 青浦区| 东海县| 灯塔市| 中西区| 建水县| 潢川县| 静安区| 行唐县| 和田市| 淳化县| 长武县| 沂源县| 鸡泽县| 昭觉县| 韶关市| 河曲县| 哈巴河县| 安顺市| 普兰店市| 甘泉县|