WedX - журнал о программировании и компьютерных науках

Напишите программу, которая умножает два числа без использования арифметических операторов

Возможный дубликат:
Как сложить два числа без использования ++, + или другого арифметического оператора.

Можно ли написать программу (на языке C), которая умножает два числа без использования каких-либо арифметических операторов (*, +, -, /,%).

c
21.01.2011

  • Дубликат: stackoverflow.com/questions/1149929/ Ответ довольно впечатляющий, хотя 21.01.2011
  • @SiegeX: Как вопрос, как умножить два числа? дубликат Как сложить два числа. Ответ, данный в указанном вопросе, также отвечает на этот вопрос, но это не делает вопрос дублирующим. 21.01.2011

Ответы:


1

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

int xor, and, temp;
and = x & y;
xor = x ^ y; 

while(and != 0 )
{
 and <<= 1; 
 temp = xor ^ and;
 and &= xor; 
 xor = temp; 
}

Для умножения a и b сложите "a" "b" раз

unsigned int mult(unsigned int a,unsigned int b)
{
    unsigned int counter=0;
    unsigned int mult = a;
    if(a == 0 || b == 0)
    {
    return 0;
    }

    //Optimize if any of the number is power of two then
    //Just right shift other with value of this number

    while(counter < b )
    {   
    counter = add(counter,1);
    mult = add(mult,a);
    }
    return mult;
}
21.01.2011
  • Где результаты? Это в xor? Если это так, это выглядит как 2 * 1 = 3 21.01.2011
  • на самом деле объединение этого с моим решением будет работать. Вы должны разложить одно из чисел в степень двойки, умножить второе на каждое и сложить все результаты. 21.01.2011

  • 2

    Конечно - если машина Тьюринга может это сделать, то сможет и C (если у вас достаточно памяти). Но вы, вероятно, не увидите, как я это пишу.

    Если вы хотите сделать это самостоятельно, один из способов - смоделировать умножение двух чисел на бумаге. Вы работаете с цифрами символически. Вам просто нужно разобраться с каждой цифрой и таблицей результатов для умножения этих цифр.

    Для сложения двух чисел можно использовать аналогичную таблицу «сложения».

    Не имеет значения, являются ли цифры, с которыми вы работаете, десятичными или двоичными - принцип тот же.

    21.01.2011

    3

    Вот как это сделать с помощью алгоритма Крестьянина. add() из ответа, который Нира дала до меня:

    #include <stdio.h>
    
    unsigned int add(unsigned int x, unsigned int y)
    {
            unsigned int xor, and, temp;
            and = x & y;
            xor = x ^ y;
            while(and != 0 ) {
                    and <<= 1;
                    temp = xor ^ and;
                    and &= xor;
                    xor = temp;
            }
            return xor;
    }
    
    int main()
    {
            unsigned int multiplicand = 41,
                         multiplier = 6,
                         res = 0;
    
            while(multiplier != 0) {
                    if (multiplier & 1) {
                            res = add(res, multiplicand);
                    }
                    multiplier >>= 1;
                    multiplicand <<= 1;
            }
            printf("6 times 41 equals %u\n", res);
            return 0;
    }
    
    21.01.2011

    4

    Вы можете умножить два числа с помощью машины Тьюринга, которая, возможно, не использует никаких арифметических операторов, просто переместите ленту влево / вправо, добавьте / удалите отметку с ленты. Поэтому вы можете написать программу на языке C, имитирующую множитель Тьюринга.

    21.01.2011

    5

    Ознакомьтесь с алгоритмом русского крестьянина.

    21.01.2011
    Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]