题目链接:http://ac.jobdu.com/problem.php?pid=1056
这道题我最开始用了很普通的方法,当然可以AC
1 #include <iostream> 2 #include <math.h> 3 using namespace std; 4 5 int main() 6 { 7 int a, b, index1, index2; 8 int ar[100000], br[100000]; 9 10 while(cin>>a>>b) 11 { 12 index1 = 0; 13 for(int i = 1; i <= a; i++) 14 { 15 if(a%i == 0) 16 ar[index1++] = i; 17 } 18 index2 = 0; 19 for(int i = 1; i <= b; i++) 20 { 21 if(b%i == 0) 22 br[index2++] = i; 23 } 24 25 int max = 0; 26 for(int i = 0; i < index1; i++) 27 { 28 for(int j = 0; j < index2; j++) 29 { 30 if(ar[i] == br[j] && max < ar[i]) 31 max = ar[i]; 32 } 33 } 34 cout<<max<<endl; 35 } 36 return 0; 37 }
后来才知道还可以用欧几里得的算法写,更简单
原理:
定理:gcd(a,b) = gcd(b,a mod b)
证明:a可以表示成a = kb + r,则r = a mod b
假设d是a,b的一个公约数,则有
d|a, d|b,而r = a - kb,因此d|r
因此d是(b,a mod b)的公约数
假设d 是(b,a mod b)的公约数,则
d | b , d |r ,但是a = kb +r
因此d也是(a,b)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证
欧几里德算法就是根据这个原理来做的,其算法用C++语言描述为:
int Gcd(int a, int b)
{
if(b == 0)
return a;
return Gcd(b, a % b);
}相当于做一下笔记,以便自己复习!
浙公网安备 33010602011771号