先写出最常用的辗转相除法
通常我们要求默认输入的两数无大小先后顺序,这个顺序需要我们用代码来判定
由此,很多人以为需要用几行比较代码来进行判定如下图
int main()
{
int a, b;
scanf("%d,%d", &a,&b);
int z;
if (a < b) //辗转相除法要求较大值%较小值,此处一般先要进行比较和交换
{
z = a;
a = b;
b = z;
}
while (z=a%b)//当a%b的值为0时退出循环
{
a = b; b = z;
}
printf("最大公约数是:%d",b);
return 0;
}
这里涉及到一个问题:辗转相除法一定要进行比较么?
测试一下
于是我们把小于换成了大于号,发现同样可以进行判定
在更改代码后,前面的几行代码似乎失去了原有的作用。于是乎,不妨尝试着将其删去
看看删掉后的状态
我们可以看到,在删掉比较的代码后程序依旧可以执行原有的功能
直接用辗转相除而省去了原有的比较大小的环节
这里涉及到一个概念,辗转相除只能用较大值%较小值,如果较小值%较大值会怎样?
答案是:返回较小值本身
在此同时利用第三个变量进行交换即可让较小值变成较大值,从而使辗转相除的代码同时也有了为两数排序的功能
代码由此得到精简