Java: получить наибольший общий делитель - PullRequest
77 голосов
/ 24 октября 2010

Я видел, что такая функция существует для BigInteger, т.е. BigInteger#gcd. Существуют ли другие функции в Java, которые также работают для других типов (int, long или Integer)? Кажется, это имеет смысл как java.lang.Math.gcd (со всеми видами перегрузок), но его там нет. Это где-то еще?


(Не путайте этот вопрос с вопросом "как мне это реализовать самостоятельно, пожалуйста!)

Ответы [ 16 ]

1 голос
/ 29 апреля 2018
public int gcd(int num1, int num2) { 
    int max = Math.abs(num1);
    int min = Math.abs(num2);

    while (max > 0) {
        if (max < min) {
            int x = max;
            max = min;
            min = x;
        }
        max %= min;
    }

    return min;
}

Этот метод использует алгоритм Евклида, чтобы получить «Величайший общий делитель» из двух целых чисел.Он получает два целых числа и возвращает их gcd.просто так просто!

0 голосов
/ 13 января 2019

Эти функции GCD, предоставляемые Commons-Math и Guava , имеют некоторые различия.

  • Коммон-Мат бросает ArithematicException.class только для Integer.MIN_VALUE или Long.MIN_VALUE.
    • В противном случае обрабатывает значение как абсолютное значение.
  • Гуава выбрасывает IllegalArgumentException.class для любых отрицательных значений.
0 голосов
/ 27 июня 2018

Это где-то еще?

Apache! - у него есть и gcd, и lcm, так круто!

Однако, из-за глубины их реализации, он медленнее по сравнению с простой рукописной версией (если это имеет значение).

0 голосов
/ 28 марта 2018

Я использовал этот метод, который создал, когда мне было 14 лет.

    public static int gcd (int a, int b) {
        int s = 1;
        int ia = Math.abs(a);//<-- turns to absolute value
        int ib = Math.abs(b);
        if (a == b) {
            s = a;
        }else {
            while (ib != ia) {
                if (ib > ia) {
                    s = ib - ia;
                    ib = s;
                }else { 
                    s = ia - ib;
                    ia = s;
                }
            }
        }
        return s;
    }
0 голосов
/ 30 июля 2016
/*
import scanner and instantiate scanner class;
declare your method with two parameters
declare a third variable;
set condition;
swap the parameter values if condition is met;
set second conditon based on result of first condition;
divide and assign remainder to the third variable;
swap the result;
in the main method, allow for user input;
Call the method;

*/
public class gcf {
    public static void main (String[]args){//start of main method
        Scanner input = new Scanner (System.in);//allow for user input
        System.out.println("Please enter the first integer: ");//prompt
        int a = input.nextInt();//initial user input
        System.out.println("Please enter a second interger: ");//prompt
        int b = input.nextInt();//second user input


       Divide(a,b);//call method
    }
   public static void Divide(int a, int b) {//start of your method

    int temp;
    // making a greater than b
    if (b > a) {
         temp = a;
         a = b;
         b = temp;
    }

    while (b !=0) {
        // gcd of b and a%b
        temp = a%b;
        // always make a greater than b
        a =b;
        b =temp;

    }
    System.out.println(a);//print to console
  }
}
0 голосов
/ 18 ноября 2013

% собирается дать нам gcd между двумя числами, это означает: - % или мод big_number / small_number is = gcd, и мы пишем это на Java, как это big_number % small_number.

EX1: для двух целых чисел

  public static int gcd(int x1,int x2)
    {
        if(x1>x2)
        {
           if(x2!=0)
           {
               if(x1%x2==0)     
                   return x2;
                   return x1%x2;
                   }
           return x1;
           }
          else if(x1!=0)
          {
              if(x2%x1==0)
                  return x1;
                  return x2%x1;
                  }
        return x2;
        } 

EX2: для трех целых чисел

public static int gcd(int x1,int x2,int x3)
{

    int m,t;
    if(x1>x2)
        t=x1;
    t=x2;
    if(t>x3)
        m=t;
    m=x3;
    for(int i=m;i>=1;i--)
    {
        if(x1%i==0 && x2%i==0 && x3%i==0)
        {
            return i;
        }
    }
    return 1;
}
...