通過例子進階學習C++(三)最大公約數


本文是通過例子學習C++的第三篇,通過這個例子可以快速入門c++相關的語法。

題目要求:輸入兩個整數,求其大公約數。

解答方法一:兩個數的最大公約數,是這兩個數中的小數,或者是這2個數的公約數中的最大數字。

這兩個數字用num1和num2存儲,min表示其中最小數字。如果num1和num2能同時整除min,則min為起最大公約數,否則min=min-1,重復該循環直到num1和num2能同時整除min。似曾相識?是的,和上一篇求最小公倍數方法差不多。

通過例子學習C++(二)最小公倍數

#include <iostream>
using namespace std;
int main()
{
	int num1,num2,min;
	cin>>num1>>num2;
    
    //求num1和num2中的最小數字
    if(num1<num2){
        min = num1;
    }else{
        min = num2;
    }
        
    while(num1 %min !=0 || num2 %min !=0){
        min--;
    }
    cout<<"數字"<<num1<<"和數字"<<num2<<"的最大公約數為:"<<min;
	return 0;
}

通過該例子,可以學習:

  • if-else語句

    為了養成良好的習慣,我在if和else語句的語句體中,都增加了大括號。這樣養成習慣后,不會忘記括號而導致的錯誤。

  • while循環

    同上,盡管while語句的語句體也只有一句,此處也增加了大括號。不能說是非常好的習慣,但可以避免忘記括號導致的錯誤。

程序運行后效果如下:

上述求最大公約數的方法,執行效率不高。可以改進如下:

解答方法二:兩個數的最大公約數,輾轉相除法(又叫歐幾里得算法)。

#include <iostream>
using namespace std;

int main()
{
	int num1,num2,r,temp;
	cin>>num1>>num2;
	cout<<"數字"<<num1<<"和數字"<<num2<<"的最大公約數為:";
 
    //通過temp變量,交換兩個數 
//    if(num1<num2){
//    	temp = num1;
//    	num1 = num2;
//    	num2 = temp;
//	} 
	
    r = num1 % num2;
    while(r !=0){
    	num1 = num2;
		num2 = r;
		r = num1 % num2; 
	}

    cout<<num2;
	return 0;
}

通過該例子,可以學習:

  • 交換兩個數字

    交換兩個數字,此處演示了通過臨時變量temp交換兩個數。

    還有另外一個方法可以交換兩個數字(此處假設num1<num2),至於為什么請自行思考:

    num1 = num2 - num1;
    num2 = num2 - num1;
    num1 = num1 + num2;
    
  • while循環

  • c++中的注釋

    在c++中單行注釋用 //

    也可以多行注釋 /* */

  • 輾轉相除法求最大公約數

    輾轉相除法為什么可以求最大公約數?對於該方法,知其然但不知所以然,只能暫時“不求甚解”。需要的的話,可以自行查詢相關證明。

程序運行后效果如下:


免責聲明!

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



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