求两个数的最大公约数


求两个数的最大公约数



问题:给定两个正整数a和b,求他们的最大公约数。

  • 最简单的方法就是穷举法,如果a>b,那么依次计算1~b的所有整数是否是a和b的公约数。
    public static void main(String[] args) {
        long timer = System.currentTimeMillis();
        System.out.println(getGCB(1000234234,1242342390));
        System.out.println(System.currentTimeMillis() - timer);
    }
    private static int getGCB(int a, int b){
        int result = 0;
        for(int i = 2; i < b; i++){
            if(a % i == 0 && b % i == 0){
                result = i;
            }
        }
        return result;
    }
运行时间为:6767ms(随着a、b的值越大该时间越长),在节省一点时间效率就是sqrt(b)
  • 辗转相除法,如果a>b,a和b的最大公约数为b和a%b的最大公约数。
    public static void main(String[] args) {
        long timer = System.currentTimeMillis();
        System.out.println(getGCB(1999999250,42342355));
        System.out.println(System.currentTimeMillis() - timer);
    }
    private static long getGCB(long a, long b){
        if(b == 0)
            return a;
        return getGCB(b, a% b);
    }
时间效率是0
  • a和b(a>b)最大公约数等于a-b的差值c和较小数b的最大公约数
public static void main(String[] args) {
        long timer = System.currentTimeMillis();
        System.out.println(getGCB(1999999250,33442355));
        System.out.println(System.currentTimeMillis() - timer);
    }
    private static int getGCB(int a, int b){
        if(a == b)
            return a;
        else if(a > b)
            return getGCB(a - b, b);
        else{
            return getGCB(b - a, a);
        }
    }
本方法可能出现异常,此为程序超出的Java虚拟机栈的大小,StackOverflowError错误。
  • 移位运算的性能非常快。对于给定的正整数a和b,不难得到如下的结论。其中getGCB(a,b)的意思是a,b的最大公约数函数:

    当a和b均为偶数,gcb(a,b) = 2*gcb(a/2, b/2) = 2*gcb(a>>1, b>>1)

    当a为偶数,b为奇数,gcb(a,b) = gcb(a/2, b) = gcb(a>>1, b)

    当a为奇数,b为偶数,gcb(a,b) = gcb(a, b/2) = gcb(a, b>>1)

    当a和b均为奇数,利用更相减损术运算一次,gcb(a,b) = gcb(b, a-b), 此时a-b必然是偶数,又可以继续进行移位运算。

public static void main(String[] args) {
        long timer = System.currentTimeMillis();
        System.out.println(getGCB(1934232340,234232265));
        System.out.println(System.currentTimeMillis() - timer);
    }
    private static int getGCB(int a, int b){
        if(a == b)
            return a;
        else if(a > b)
            return getGCB(b, a);
        else{
            if((a&1) != 1 && (b&1) != 1)
                return getGCB(b >> 1, a >> 1)<<1;
            else if((a&1) != 1 && (b&1) == 1)
                return getGCB(a >> 1, b);
            else if((a&1) == 1 && (b&1) != 1)
                return getGCB(a, b>>1);
            else{
                return getGCB(a, b -a);
            }
        }
    }
时间: 2024-12-26 00:58:06

求两个数的最大公约数的相关文章

写一个方法,求两个数的最大公约数和最小公倍数。

package homework0702; /* * 最大公约数 利用辗转相除法求解两个正整数的最大公约数 在循环中,只要除数不等于0,用较大的数除以较小的数,将小的一个数作为下一轮循环的大数,取得的余数作为下一轮循环较小的数,如此循环直到较小的数值为0,返回较大的数.即为最大公约数. 辗转相除法(欧几里得算法) 定理:两个整数的最大公约数等于其中较小的那个数和两数的相除余数的最大公约数.最大公约数(greatest common divisor)缩写为gcd. 最小公倍数 最小公倍数 = (a

求两个数的最大公约数和最小公倍数

import java.util.Scanner; //求两个数的最大公约数,最小共倍数. public class CommonMaxDivisor { public static void main(String[] args){ Scanner scanner=new Scanner(System.in); int m=scanner.nextInt(); int n=scanner.nextInt(); scanner.close(); CommonMaxDivisor cmd=new

求两个数的最大公约数和最小公倍数 C语言

C程序设计第八章的第一道题目,求两个数的最大公约数和最小公倍数.需要注意一下几点: 1.最大公约数和最小公倍数间的关系: 设两个数是a,b最大公约数是p,最小公倍数是q 那么有这样的关系:ab=pq 所以q=ab/p.2.任意整数和0的公约数是该整数的所有约数,所以它们的最大公约数为该整数本身.3.碾转相除法:被除数%除数=余数,如果余数不为0,就让原来的除数做为被除数,余数作为除数,再进行运算 被除数%除数=余数,直到得到的余数为0为止,此时的除数就是最大公约数. #include <stdi

[000]求两个数的最大公约数

求出两个数的最大公约数 1 int foo(int v1, int v2) 2 { 3 while(v2) { 4 int temp = v2; 5 v2 = v1 % v2; 6 v1 = temp; 7 } 8 9 return v1; 10 } [000]求两个数的最大公约数,布布扣,bubuko.com

c语言:求两个数的最大公约数。

求两个数的最大公约数. 程序: #include <stdio.h> int main() { int num1, num2, t; printf("请输入两个正整数:"); scanf("%d%d",&num1, &num2);//7,8 while (t = num1%num2)//7           1        0,循环结束 { num1 = num2;     //8           7 num2 = t;     

C语言--求两个数的最大公约数

问题: 求两个数的最大公约数 #include<stdio.h> #include<math.h>  main() { int a,b,c,i,j; printf("请输入三个数(数以逗号隔开):\n"); int arr[3]; int t; scanf_s("%d,%d,%d", &a,&b,&c); arr[0] = a;  arr[1] = b;  arr[2] = c; for (j = 0; j < 

C语言求两个数中最大公约数

在C语言中如何求两个数的最大公约数呢?下面用三种方法进行求解. 方法一:穷举法. 先比较两个数的大小,然后找出较小数t,最后判断t为何值时两个数都能整除,此方法效率较低. 代码如下: #include<stdio.h> int main() {      int num1,num2,temp,i;      scanf("%d%d",&num1,&num2);      if(num1>num2)      {            temp=num1

编写C语言程序求两个数的最大公约数

//求两个数的最大公约数 #include <stdio.h> int main() {  int num1,num2;  int temp;  scanf("%d%d",&num1,&num2);  //核心算法  while(num1 % num2 != 0)  {   temp = num2;   num2 = num1%num2;   num1 = temp;  }  printf("最大公约数为:%d\n",num2);  re

求两个数的最大公约数--简单

//求两个数的最大公约数 import java.io.IOException; import java.util.Scanner; public class p55 { public static void main(String[] args) throws IOException { int a,b,k; Scanner reader=new Scanner(System.in); System.out.print("输入第一个整数:"); a=reader.nextInt();