中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言怎么求兩個正整數的最大公約數

發布時間:2021-12-13 09:03:50 來源:億速云 閱讀:411 作者:iii 欄目:開發技術

這篇文章主要介紹“C語言怎么求兩個正整數的最大公約數”,在日常操作中,相信很多人在C語言怎么求兩個正整數的最大公約數問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C語言怎么求兩個正整數的最大公約數”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

前言

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

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

1.窮舉法

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

//函數功能:計算a和b的最大公約數,輸入負數時返回-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;
}

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

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

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

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

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

//函數功能:計算a和b的最大公約數,輸入負數時返回-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;
}

我們也可以考慮使用遞歸實現如下:

//函數功能:計算a和b的最大公約數,輸入負數時返回-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.遞歸方法

對于最大公約數,還有3條性質:

性質1 如果 a>b,則a和b與a-b和b的最大公約數相同;

性質2 如果 b>a,則a和b與a和b-a的最大公約數相同;

性質3 如果 a=b,則a和b的最大公約數與a值和b值相同。

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

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

//函數功能:計算a和b的最大公約數,輸入負數時返回-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;
}

編寫遞歸函數如下:

//函數功能:計算a和b的最大公約數,輸入負數時返回-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);
}

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

#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;
}

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

附:相減法

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

代碼如下:

#include<stdio.h>

int main()

{

	int m,n;

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

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

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

    while(m!=n)

	{

		if(m>n)

		{

			m=m-n;

		}else

		{

			n=n-m;

		}	

	}

	printf("%d",n);

	return 0;

}

到此,關于“C語言怎么求兩個正整數的最大公約數”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平定县| 万安县| 靖州| 临潭县| 襄汾县| 香港| 肥西县| 宜黄县| 彰化县| 呼伦贝尔市| 米易县| 两当县| 会同县| 绿春县| 射阳县| 万盛区| 库尔勒市| 甘德县| 舟曲县| 克山县| 囊谦县| 胶州市| 宁波市| 克拉玛依市| 郑州市| 南部县| 板桥市| 双城市| 平顶山市| 深水埗区| 永靖县| 平陆县| 收藏| 新龙县| 洞口县| 丰都县| 鄂尔多斯市| 大新县| 阿克陶县| 辛集市| 左权县|