Деление без использования оператора '/'

Я не могу использовать '/' и циклы, и мне нужно разделить некоторые числа. операнды 32-битные, и я не могу использовать рекурсию.

Я думал об использовании shr, но это дает мне только 2 ^ n divison, а также не сохраняет напоминание.

Любые идеи?


person Dorni    schedule 08.05.2017    source источник
comment
Деление - это просто многократное вычитание. Почему нельзя использовать оператор деления?   -  person i_am_jorf    schedule 08.05.2017
comment
Нет петель. Означает ли это, что рекурсия включена или выключена?   -  person user4581301    schedule 08.05.2017
comment
использовать функцию fmod() or div()?   -  person Fredrik Pihl    schedule 08.05.2017
comment
Возможно, некоторые подробности помогут. Какие типы данных мы можем предположить, необходимо разделить? uint32_t? int64_t?   -  person AndyG    schedule 08.05.2017
comment
У вас есть гвозди и забор, почему вы не можете использовать молоток?   -  person ThingyWotsit    schedule 08.05.2017
comment
С++ или С? Пожалуйста, выберите только один.   -  person Paul R    schedule 08.05.2017
comment
Я не могу использовать оператор деления, потому что я работаю в закрытой системе с ограниченной памятью. Рекурсия исключена. Номер uint32. язык С.   -  person Dorni    schedule 08.05.2017
comment
Итак.. как тогда оправдано отсутствие циклов?   -  person Eugene Sh.    schedule 08.05.2017
comment
@Domi любой обходной путь, вероятно, потребует больше памяти, чем обычный оператор деления ??!   -  person AlexG    schedule 08.05.2017
comment
@AlexG Это точно ... звучит как выдуманное требование или оправдание ...   -  person Eugene Sh.    schedule 08.05.2017
comment
Является ли делитель константой, известной во время компиляции?   -  person Paul R    schedule 08.05.2017
comment
Использовать цикл for?   -  person George    schedule 08.05.2017
comment
@PaulR Известно, что числа вроде 27   -  person Dorni    schedule 08.05.2017
comment
@Dorni: в этом случае вы можете просто использовать метод магических чисел, который требует только умножения, сложение и сдвиг. Пожалуйста, нажмите кнопку изменить и добавьте всю необходимую информацию из комментариев в свой вопрос, так как людей раздражает его расплывчатость.   -  person Paul R    schedule 08.05.2017
comment
Связанный вопрос (возможный дубликат): выполнить целочисленное деление с помощью умножения.   -  person Paul R    schedule 08.05.2017
comment
Я посоветовался с мистером Оккамом, и он сказал, что это плохо замаскированный вопрос о домашнем задании с искусственными ограничениями, примененными проф./ТА.   -  person ThingyWotsit    schedule 08.05.2017
comment
Напоминает meta.stackexchange.com/questions/66377/ в чем проблема   -  person MBo    schedule 09.05.2017


Ответы (4)


#include <stdio.h>
#include <stdlib.h>

int main()
{
   div_t output;

   output = div(27, 4);
   printf("Quotient part of (27/ 4) = %d\n", output.quot);
   printf("Remainder part of (27/4) = %d\n", output.rem);

   output = div(27, 3);
   printf("Quotient part of (27/ 3) = %d\n", output.quot);
   printf("Remainder part of (27/3) = %d\n", output.rem);

   return(0);
}

Выход:

Quotient part of (27/ 4) = 6
Remainder part of (27/4) = 3
Quotient part of (27/ 3) = 9
Remainder part of (27/3) = 0
person Fredrik Pihl    schedule 08.05.2017

Попробуйте этот метод на основе магических чисел:
я применил его на основе этого ссылка
Полезно только с фиксированным делителем.

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    // your code goes here

    unsigned long MAX_NUM=1<<30; //Max num = 1073741824

    unsigned long num = 1073741824;
    unsigned long divisor=17;

    //unsigned long magic_num=round(double(MAX_NUM)/divisor);
    unsigned long magic_num = 63161284 // Fixed for divisor = 17

    unsigned long div = (num * magic_num) >> 30;
    unsigned long remain = num - div * divisor;

    cout << div << endl;
    cout << remain << endl;

    return 0;
}
person Rama    schedule 08.05.2017

Если это академическое упражнение, они, вероятно, хотят, чтобы вы сделали:

а/б ::== е**(лог(а) - лог(б))

person user3344003    schedule 08.05.2017
comment
OP утверждает, что это для системы с ограниченными ресурсами, по-видимому, поэтому я полагаю, что трансцендентные функции, вероятно, будут запрещены. - person Paul R; 08.05.2017
comment
И он хочет это с остатком. Но я бы скорее закрыл вопрос как неясный с такими требованиями, которые не совпадают. - person Eugene Sh.; 08.05.2017
comment
кажется, что мы попадаем в невозможность сейчас здесь. - person user3344003; 08.05.2017

int a_div_b( int a, int b, int pow=0 ) {
  if (a<b) return 0;
  if (a < (b<<(pow+1)))
    return a_div_b(a-(b<<pow), b) + (1<<pow);
  return a_div_b(a, b, pow+1);
}

Нет циклов, нет /, O((log(a/b))^2) времени. Я, вероятно, мог бы улучшить до O(log(a/b)), но я ленив (рекурсивно вниз от максимального pow, как только вы его найдете, а не обратно).

Остаток можно легко вычислить с помощью b-a_div_b(a,b)*a без использования циклов или /.

Он должен использовать память O (1), поскольку он рекурсивен в конце.

person Yakk - Adam Nevraumont    schedule 08.05.2017
comment
Хороший ответ, но OP говорит в комментариях: рекурсия исключена из таблицы, что, как я понимаю, означает, что рекурсия не разрешена. - person Paul R; 08.05.2017
comment
@PaulR Я рад, что у ОП другой вопрос. Он может нажать кнопку «Задать вопрос», чтобы задать его. - person Yakk - Adam Nevraumont; 08.05.2017
comment
Да, в этом вопросе стрелки меняются довольно быстро! - person Paul R; 08.05.2017
comment
Я бы сказал, просто разверните это для 32-битных значений без знака. - person Khouri Giordano; 08.05.2017
comment
Я думаю, что рекурсия будет использовать много памяти с большими числами, поэтому я не должен ее использовать. - person Dorni; 08.05.2017
comment
@Dorni Нет, здесь используется память O (1), если ваш компилятор не умер; это хвостовая рекурсия. - person Yakk - Adam Nevraumont; 08.05.2017