Деление без использования «/» - PullRequest
46 голосов
/ 22 марта 2011

Может кто-нибудь сказать мне эффективный подход к выполнению операции деления без использования '/'.Я могу вычислить целочисленное значение с шагом log(n), используя метод, аналогичный бинарному поиску.

115/3 
57 * 3 > 115
28 * 3 < 115
47 * 3 > 115
.
.
.
38 * 3 is quotient value .....

Но есть ли другой более эффективный метод?

Ответы [ 16 ]

0 голосов
/ 25 апреля 2018

Если вы берете деление в качестве вычитания, то, чем оно в принципе является, вы можете использовать метод «декремент», который позволяет вам вообще не использовать никаких операторов, за исключением ~ в конце, чтобы инвертировать результат позже вположительное целое число или любое другое значение.

private static int decrement(int i) {

    System.out.println("Value of decrement : ");
    System.out.println(i);
    return i - 1;
}

private static int divide(int n, int d) {

    assert n > 0 && d > 0;
    int counter = 0;
    while (n >= d) {
        for (int i = d; i > 0; i = decrement(i)) {

            n = decrement(n);
        }
        counter = decrement(counter);

    }
    counter  =~decrement(counter);
    System.out.println(counter);
    return counter;
}
0 голосов
/ 09 июня 2016

Это функция, которая решила мою проблему:

func printRemainderAndQuotient(numerator: Int,divisor: Int) {
  var multiplier = 0
  var differene = numerator - divisor
  var dynamicNumber = 0
  if divisor == 0 {
    print("invalid divisor")
    return
  }
  if divisor == numerator {
    print("quotient : " + "1")
    print("remainder : " + "0")
    return
  }
  while differene >= divisor {
    multiplier = multiplier + 1
    dynamicNumber = divisor * multiplier
    differene = numerator - dynamicNumber
  }
  print("quotient : " + "\(multiplier)")
  print("remainder : " + "\(differene)")
}
0 голосов
/ 08 июля 2014
    private int divideBy2(int number){

    int count = 1;
    while(count<=number){

        if(count*2==number){

            return count;
        }
        count++;
    }
    return count;

}
0 голосов
/ 17 октября 2013

хорошо, давайте посмотрим ... x / y = e ^ (ln (x) -ln (y))

0 голосов
/ 22 марта 2011

Что ж, если это только целочисленное / целочисленное = типовое деление, довольно просто получить целочисленную часть x / n = int.dec, добавив n + n + n + n, пока n не станет больше x, тогда вычитая одно из вашего числа 'n'.

Чтобы получить int / int = real без использования *, /,% или других математических функций, вы можете сделать несколько вещей. Вы можете вернуть остаток как рациональное, например. Это имеет преимущество в том, чтобы быть точным. Вы также можете использовать модификацию строки, чтобы превратить ваш r в r0 ... (вы выбираете точность), а затем повторить тот же трюк сложения, а затем объединить результаты.

И, конечно, вы можете попробовать повеселиться со сдвигом битов.

Я не знаю, является ли это настолько «глупой уловкой», сколько проверкой того, насколько хорошо вы можете использовать простые вещи (сложение, вычитание) для построения сложной вещи (деления). Это навык, который может понадобиться вашему потенциальному работодателю, потому что нет оператора для всего. Подобный вопрос должен (теоретически) отсеять людей, которые не могут разрабатывать алгоритмы, от людей, которые могут.

Думаю, проблема в том, что ответ так легко доступен в Интернете, но это проблема реализации.

0 голосов
/ 22 марта 2011

Возможно, вы можете придумать способ сделать это, используя последовательности >> (сдвиги битов) с другими побитовыми операторами. В псевдо-коде есть пример в Википедии: побитовый оператор статья.

...