通过例子进阶学习C++(三)最大公约数
本文是通过例子学习C++的第三篇,通过这个例子可以快速入门c++相关的语法。
题目要求:输入两个整数,求其大公约数。
解答方法一:两个数的最大公约数,是这两个数中的小数,或者是这2个数的公约数中的最大数字。
这两个数字用num1和num2存储,min表示其中最小数字。如果num1和num2能同时整除min,则min为起最大公约数,否则min=min-1,重复该循环直到num1和num2能同时整除min。似曾相识?是的,和上一篇求最小公倍数方法差不多。
#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++中单行注释用 //
也可以多行注释 /* */
-
辗转相除法求最大公约数
辗转相除法为什么可以求最大公约数?对于该方法,知其然但不知所以然,只能暂时“不求甚解”。需要的的话,可以自行查询相关证明。
程序运行后效果如下:
所有文章,坚持原创。如有转载,敬请标注出处。