Добавьте два числа без использования операторов + и - - PullRequest
2 голосов
/ 12 марта 2011

Предположим, у вас есть два числа, оба целые числа со знаком, и вы хотите их суммировать, но не можете использовать обычные операторы + и - вашего языка.Как бы вы это сделали?

На основе http://www.ocf.berkeley.edu/~wwu/riddles/cs.shtml

Ответы [ 13 ]

5 голосов
/ 12 марта 2011

Не мой, а милый

int a = 42;
int b = 17;
char *ptr = (char*)a;
int result = (int)&ptr[b];
3 голосов
/ 12 марта 2011

передергивает.Никто больше не строит сумматор из 1-битных сумматоров.

do {
  sum = a ^ b;
  carry = a & b;
  a = sum;
  b = carry << 1;
} while (b);
return sum;

Конечно, здесь предполагается, что арифметика будет без знака по модулю 2 n или дополнением до двух.Гарантируется, что работа в C возможна только в том случае, если вы преобразуете в неподписанное, выполняете вычисление без знака, а затем преобразуете обратно в подписанное.

3 голосов
/ 12 марта 2011

Использование побитовых операций, таких как Схема сумматора

2 голосов
/ 12 марта 2011

Поскольку ++ и -- не являются + и - операторами:

int add(int lhs, int rhs) {
    if (lhs < 0)
        while (lhs++) --rhs;
    else
        while (lhs--) ++rhs;
    return rhs;
}
1 голос
/ 12 марта 2011

Вот что-то отличное от того, что уже было опубликовано.Используйте факты, которые:

log (a^b) = b * log a
e^a * e^b = e^(a + b)

Итак:

log (e^(a + b)) = log(e^a * e^b) = a + b (if the log is base e)

Так что просто найдите log(e^a * e^b).

Конечно, это просто теоретически, на практике это происходитбыть неэффективным и, скорее всего, неточным.

1 голос
/ 12 марта 2011

Использование побитовой логики:

int sum = 0;
int carry = 0;

while (n1 > 0 || n2 > 0) {
  int b1 = n1 % 2;
  int b2 = n2 % 2;

  int sumBits = b1 ^ b2 ^ carry;
  sum = (sum << 1) | sumBits;
  carry = (b1 & b2) | (b1 & carry) | (b2 & carry);
  n1 /= 2;
  n2 /= 2;
}
0 голосов
/ 14 апреля 2019
#include <stdio.h>

int main()
{
    int n1=5,n2=55,i=0;
    int sum = 0;
    int carry = 0;

    while (n1 > 0 || n2 > 0) 
    {
        int b1 = n1 % 2;
        int b2 = n2 % 2;

        int sumBits = b1 ^ b2 ^ carry;
        sum = sum | ( sumBits << i);
        i++;
        carry = (b1 & b2) | (b1 & carry) | (b2 & carry);
        n1 /= 2;
        n2 /= 2;
    }   
    sum = sum | ( carry << i );

    printf("%d",sum);

    return 0;
}
0 голосов
/ 07 апреля 2018

Я понимаю, что это может быть не самым элегантным решением проблемы, но я нашел способ сделать это, используя функцию len (list) вместо оператора сложения.

'''
Addition without operators: This program obtains two integers from the user
and then adds them together without using operators. This is one of the 'hard'
questions from 'Cracking the Coding Interview' by 
'''

print('Welcome to addition without a plus sign!')
item1 = int(input('Please enter the first number: '))
item2 = int(input('Please eneter the second number: '))

item1_list = []
item2_list = []
total = 0
total_list = []
marker = 'x'
placeholder = 'placeholder'

while len(item1_list) < item1:
    item1_list.append(marker)

while len(item2_list) < item2:
    item2_list.append(marker)

item1_list.insert(1, placeholder)
item1_list.insert(1, placeholder)

for item in range(1, len(item1_list)):
    total_list.append(item1_list.pop())

for item in range(1, len(item2_list)):
    total_list.append(item2_list.pop())

total = len(total_list)

print('The sum of', item1, 'and', item2, 'is', total)
0 голосов
/ 12 марта 2011

Не очень креативно, я знаю, но в Python:

сумма ([а, Ь])

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

Простой пример на Python, дополненный простым тестом:

NUM_BITS = 32

def adder(a, b, carry):
    sum = a ^ b ^ carry
    carry = (a & b) | (carry & (a ^ b))
    #print "%d + %d = %d (carry %d)" % (a, b, sum, carry)
    return sum, carry

def add_two_numbers(a, b):
    carry = 0
    result = 0
    for n in range(NUM_BITS):
        mask = 1 << n
        bit_a = (a & mask) >> n
        bit_b = (b & mask) >> n
        sum, carry = adder(bit_a, bit_b, carry)
        result = result | (sum << n)
    return result


if __name__ == '__main__':
    assert add_two_numbers(2, 3) == 5
    assert add_two_numbers(57, 23) == 80

    for a in range(10):
        for b in range(10):
            result = add_two_numbers(a, b)
            print "%d + %d == %d" % (a, b, result)
            assert result == a + b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...