【C++最大公約數】詳解(從暴力到遞歸)


主要是面向新手,順便鞏固一下我的概念(〃'▽'〃)

題目描述

求兩個數m和n的最大公約數。((m>0,n>0))

輸入

輸入二個數,即m和n的值。

輸出

輸出最大公約數。

法1(參考《信息學奧賽一本通》)

求任意兩數(假設是n,m)的公約數,公約數最大可能就是較小的那個數(假設為m),最小為1。所以可以先設最大公約數gys=m。如果gys>1,且沒被n,m整除,則gys-1,繼續執行綠色部分~

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int num1,num2,ans=0;
 6     cin>>num1>>num2;
 7     ans=num1>num2? num1:num2;//三目運算符 
 8     while(ans>1&&(num1%ans!=0||num2%ans!=0))
 9         ans--
10     cout<<ans<<endl;
11     return 0;
12 } 

 

注意在搜尋之前要先比大小,把大一點的數放前面。因為我們默認公約數最大可能就是較小的那個數,較小的那個數放后面,所以用三目運算符交換處理了

法2(參考《信息學奧賽一本通》)

法1只能通過一直-1來搜尋,是不是太慢了?如果是一千億和一千萬億來找公約數時間很有可能就不夠了!!!∑(゚Д゚ノ)ノ,不過沒關系,前人已經給我們找到了一種方法——輾轉相除法(歐幾里得算法)歐幾里得算法不再贅述,百度詞條傳送門<---------

用n和m表示被除數,除數,r表示余數,n和m的最大公約數=m與r的最大公約數。算法如下

  1. 求n%m的值r
  2. 如果r!=0,執行3。r=0則m為最大公約數,return 0;
  3. 以m的值作為新n,r的值作為新m,執行2
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int num1,num2,num3=0;ans=0;
 6     cin>>num1>>num2;
 7     ans=num1>num2? num1:num2;//三目運算符 
 8     num3=num1%num2;
 9     while(num3!=0)
10     {
11         (新的)num1=(舊的)num2;
12        (新的)num2=(舊的)num3;
13         (新的num3=(新的)num1%(新的)num2;
14     }
15     cout<<m<<endl;
16     return 0;
17 } 

 

法3:遞歸

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int ans;
 4 int gys(int n,int m)
 5 {
 6     if(m==0)    return n;//如果余數=0,返回除數的值(除數就是最大公約數)
 7     gys(m,n%m);/*否則把m的值賦在形參n(被除數)的位置上,把n%m的值賦在形參m(除數)的位置上*/
 8 }
 9 int main()
10 {
11     int num1,num2,num3=0,num4=0;
12     cin>>num1>>num2;
13     num3=max(num1,num2);
14     num4=min(num1,num2);
15     cout<<"gcd="<<gys(num3,num4)<<endl;
16     //cout<<num3<<" "<<num4<<endl;
17     return 0;
18 } 

 

參考法2一定能看懂,不懂在評論區問我就可以啦( • ̀ω•́ )✧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM