求最大公约数有暴力法和辗转相除法
时间复杂度
暴力:O(N)
辗转相除法:O(2logN)
辗转相除法原理:
设c为A B 的最大公约数 则存在K1 K2 使 A=K1*c B=K2*c;
r为A模B r=A - K3*B;
r=K1*c-K3*k2*c;
r=(K1-K2*K3)*c;
所以A 和 B 的余数一定是最大公约数c的倍数
1 #include <stdio.h> 2 3 int gcd(int a, int b) 4 { 5 int temp, r; 6 if(a<b) 7 { 8 temp = a; 9 a = b; 10 b = temp; 11 } 12 while(a % b) 13 { 14 r = a%b; 15 a = b; 16 b = r; 17 } 18 return b; 19 } 20 21 int main() 22 { 23 int a, b, answer; 24 scanf("%d%d",&a,&b); 25 answer = gcd(a,b); 26 printf("%d\n",answer); 27 return 0; 28 }
时间: 2024-10-12 05:56:03