Напишите функцию для деления числа на 3 без использования операторов /,% и *. Итоа () доступны? - PullRequest
8 голосов
/ 15 января 2010

Я пытался решить это сам, но я не мог получить никакой подсказки.

Пожалуйста, помогите мне решить эту проблему.

Ответы [ 17 ]

14 голосов
/ 15 января 2010

Вы должны использовать itoa () для этого задания? Потому что тогда вы можете использовать это, чтобы преобразовать в строку с базой 3, удалить последний символ, а затем восстановить обратно на базу 10.

10 голосов
/ 15 января 2010

Используя математическое соотношение:

1/3 == Sum[1/2^(2n), {n, 1, Infinity}]

У нас есть

int div3 (int x) {
   int64_t blown_up_x = x;
   for (int power = 1; power < 32; power += 2)
      blown_up_x += ((int64_t)x) << power;
   return (int)(blown_up_x >> 33);
}

Если вы можете использовать только 32-разрядные целые числа,

int div3 (int x) {
     int two_third = 0, four_third = 0;
     for (int power = 0; power < 31; power += 2) {
        four_third += x >> power;
        two_third += x >> (power + 1);
     }
     return (four_third - two_third) >> 2;
}

4/3 - 2/3 лечение используется потому что x >> 1 это floor(x/2) вместо round(x/2).

9 голосов
/ 15 января 2010

РЕДАКТИРОВАТЬ: Ой, я неправильно прочитал вопрос названия. Оператор умножения также запрещен.

Во всяком случае, я считаю, что не стоит удалять этот ответ для тех, кто не знал о делении не-степенью двух констант. Решение состоит в том, чтобы умножить на магическое число и затем извлечь 32 крайних левых бита:

деление на 3 эквивалентно умножению на 1431655766 и затем сдвигу на 32 в C:

int divideBy3(int n)
{
  return (n * 1431655766) >> 32;
}

См. Калькулятор чисел Магии Восторга Хакера .

9 голосов
/ 15 января 2010

x / 3 = e ^ (ln (x) - ln (3))

4 голосов
/ 15 января 2010

Вот решение, реализованное в C ++:

#include <iostream>

int letUserEnterANumber()
{
    int numberEnteredByUser;
    std::cin >> numberEnteredByUser;
    return numberEnteredByUser;
}

int divideByThree(int x)
{
    std::cout << "What is " << x << " divided by 3?" << std::endl;
    int answer = 0;
    while ( answer + answer + answer != x )
    {
        answer = letUserEnterANumber();
    }
}

; -)

3 голосов
/ 15 января 2010
if(number<0){ // Edited after comments
number = -(number);
}
quotient = 0;
while (number-3 >= 0){ //Edited after comments..
number = number-3;
quotient++;
}//after loop exits value in number will give you reminder

РЕДАКТИРОВАТЬ: Протестировано и работает отлично: (

Надеюсь, это помогло. : -)

1 голос
/ 15 января 2010

Это очень легко, так просто, я только намекаю на ответ -

Базовые логические логические элементы (и, или нет, xor, ...) не делят. Несмотря на этот недостаток, процессоры могут делать деление. Ваше решение очевидно: найдите ссылку, которая расскажет вам, как построить делитель с логической логикой, и напишите некоторый код для его реализации.

1 голос
/ 15 января 2010

Звучит как домашнее задание:)

Я представляю, что вы можете написать функцию, которая итеративно делит число. Например. Вы можете смоделировать то, что вы делаете с ручкой и листком бумаги, чтобы разделить числа. Или вы можете использовать операторы сдвига и +, чтобы выяснить, являются ли ваши промежуточные результаты слишком маленькими / большими, и итеративно применять исправления. Я не собираюсь записывать код, хотя ...

1 голос
/ 24 декабря 2011

вы можете использовать свойство из чисел: число делится на 3, если его сумма делится на 3. Возьмите отдельные цифры из itoa () и затем рекурсивно используйте для них функцию switch с добавками и itoa ()

Надеюсь, это поможет

1 голос
/ 20 января 2010
long divByThree(int x)
{    
  char buf[100];
  itoa(x, buf, 3); 
  buf[ strlen(buf) - 1] = 0; 
  char* tmp; 
  long res = strtol(buf, &tmp, 3);

  return res;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...