输入 a 和 b , 请返回 a 和 b 的最大公约数。
数据范围:
进阶:空间复杂度
,时间复杂度 )
3,6
3
8,12
4
a和b的范围是[1-109]
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # 求出a、b的最大公约数。 # @param a int # @param b int # @return int # class Solution: def gcd(self , a , b ): # print(a,b) # write code here if a < b: #保证 a>b tmp = a a = b b = tmp # print(a,b) c = a % b if c == 0: return b else: return self.gcd(b,c)更相减损法
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 求出a、b的最大公约数。
* @param a int
* @param b int
* @return int
*/
public int *** (int a, int b) {
// write code here
//方法1:暴力枚举
// int min = a < b ? a : b;
// for(int i = min;i >= 1;i--){
// if(a % i == 0 && b % i == 0){
// return i;
// }
// }
// return 0;
//方法2:暴力枚举法优化
// int max = a > b ? a : b;
// int min = a < b ? a : b;
// if(max % min == 0) return min;
// for(int i = min / 2;i >= 1;i--){
// if(a % i == 0 && b % i == 0){
// return i;
// }
// }
// return 0;
//方法3:辗转相除法
// int max = a > b ? a : b;
// int min = a < b ? a : b;
// if(max % min == 0) return min;
// return ***(max % min, min);
//方法4:更相减损术(避免了取模运算,用效率更高的减法运算替代)
// int max = a > b ? a : b;
// int min = a < b ? a : b;
// if(max % min == 0) return min;
// return ***(max - min, min);
//方法5:更相减损术非递归实现
while(a != b){
if(a > b) a -= b;
else b -= a;
}
return a;
//方法6:3与4相结合
//3的缺点在于取模运算效率低下,4的缺点在于减法运算次数增加
//将二者结合,取其精华,去其糟粕
// if(a == b) return a;
// if((a & 1) == 0 && (b & 1) == 0){
// return ***(a >> 1, b >> 1) << 1;
// }else if((a & 1) == 0 && (b & 1) != 0){
// return ***(a >> 1, b);
// }else if((a & 1) != 0 && (b & 1) == 0){
// return ***(a, b >> 1);
// }else {
// int max = a > b ? a : b;
// int min = a < b ? a : b;
// return ***(min, max - min);
// }
}
} # # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # 求出a、b的最大公约数。 # @param a int # @param b int # @return int # class Solution: def gcd(self , a , b ): # write code here # 减法 # while a!=b : # if(a>b): # a=a-b # else: # b=b-a # return a # 除法求余 while b!=0: a,b = b,a%b return a
if(a%b ==0 || b%a ==0) return a%b==0?b:a;
while(a!=b){
if(a>b) a=a-b;
else b=b-a;
}
// 返回b和返回a是一样的效果
return b
看到大佬的思路才知道需要循环相减,知道两数最后相等才推出循环,加油打工人
public static int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # 求出a、b的最大公约数。 # @param a int整型 # @param b int整型 # @return int整型 # class Solution: def gcd(self , a: int, b: int) -> int: # write code here the_a = max(a, b) the_b = min(a, b) while the_a%the_b != 0: res = the_a%the_b the_a,the_b = the_b,res return the_b辗转相除法
public int gcd (int a, int b) {
// write code here
int num=Math.min(a,b) ,temp=num ,index=1;
while(temp>1){
temp=num/index++;
if(a%temp==0 && b%temp==0){
break;
}
}
return temp;
// ---------------------------------------------------------------
if(a%b==0){
return b;
}
return gcd(b ,a%b);
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 求出a、b的最大公约数。
* @param a int整型
* @param b int整型
* @return int整型
*/
public int gcd (int a, int b) {
// write code here
// gcd(a, b) = gcd(b, a % b)
// 任意整数和0的公约数是该整数的所有约数
// 它们的最大公约数为该整数本身
// 记公式就好
return (b == 0) ? a : gcd(b, a % b);
}
}