目录
核心代码
int gcd(int b,int a)
{
int r=b%a;
while(r!=0)
{
b=a;
a=r;
r=b%a;
}
return a;
}
证明(图像证明)
求a,b 的最大公约数,就是求最大的能完整覆盖a*b的长方形(即无缝隙空余)的正方形的边长,如图所示
如上图,这是一个a*b的长方形,我们以短边为第一个正方形的边长。尽可能多地覆盖,我们发现最后还剩下一个小长方形。
如上图:我们继续分割小正方形,此时小正方形的边长变为b%a,要分割的新矩形长a宽b%a
······以此类推,一直到正方形刚好能覆盖整个矩形为之。
疑点解释
1. 由上图我们可以知道每次下一轮出现的小正方形是一定可以构成上一轮的大正方形的,因为下一轮小正方形的边长可以构成上一轮大正方形的边长。
2. 如上图所示,我们知道b>a,但如果输出的时候a>b,此时程序还成立吗?
答案是成立的:
如:求12,16的最大公约数:
int gcd(int b,int a)//b=12,a=16
{
int r=b%a;//r=12%16=12
while(r!=0)//12!=0执行
{
b=a;//b=16
a=r;//a=r=12
r=b%a;//r=16%12
}
return a;
}
如上,手模一个12,16
我们发现,第一轮进行完之后,如果a>b,此时r=b(较小数),b=a(较大数), a=r(较小数)
此时,a,b两数调换位置,导致无论如何第二轮的b都大于a,所以不会影响
完整代码:
#include<bits/stdc++.h>
using namespace std;
int gcd(int b,int a)
{
int r=b%a;
while(r!=0)
{
b=a;
a=r;
r=b%a;
}
return a;
}
int main()
{
int a,b;
cin>>a>>b;
cout<<gcd(a,b);
return 0;
}
运行情况: