通过例子进阶学习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++中单行注释用 //

    也可以多行注释 /* */

  • 辗转相除法求最大公约数

    辗转相除法为什么可以求最大公约数?对于该方法,知其然但不知所以然,只能暂时“不求甚解”。需要的的话,可以自行查询相关证明。

程序运行后效果如下:

posted @ 2020-01-13 07:04  siwei718  阅读(982)  评论(0编辑  收藏  举报