Я не могу использовать '/' и циклы, и мне нужно разделить некоторые числа. операнды 32-битные, и я не могу использовать рекурсию.
Я думал об использовании shr, но это дает мне только 2 ^ n divison, а также не сохраняет напоминание.
Любые идеи?
Я не могу использовать '/' и циклы, и мне нужно разделить некоторые числа. операнды 32-битные, и я не могу использовать рекурсию.
Я думал об использовании shr, но это дает мне только 2 ^ n divison, а также не сохраняет напоминание.
Любые идеи?
#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
Попробуйте этот метод на основе магических чисел:
я применил его на основе этого ссылка
Полезно только с фиксированным делителем.
#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;
}
Если это академическое упражнение, они, вероятно, хотят, чтобы вы сделали:
а/б ::== е**(лог(а) - лог(б))
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), поскольку он рекурсивен в конце.
fmod() or div()
? - person Fredrik Pihl   schedule 08.05.2017