输入 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); } }