编写一个程序,将两个数字相乘,而不使用算术运算符

时间:2011-01-21 06:41:32

标签: c

  

可能重复:
  How to add two numbers without using ++ or + or another arithmetic operator.

是否可以编写一个程序(在C中),它将两个数字相乘而不使用任何arithemetic运算符(*,+, - ,/,%)。

5 个答案:

答案 0 :(得分:3)

如果你可以使用按位运算符添加

,下面的代码片段可能会有所帮助
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;
}

答案 1 :(得分:2)

当然 - 如果图灵机可以做到,那么C(只要你有足够的内存)。但你可能不会看到我写它。

如果你想自己这样做,一种方法是模拟你如何在纸上增加两个数字。您可以象征性地使用数字。您只需要处理每个数字和一个结果表,以便将这些数字相乘。

要添加这两个数字,可以使用类似的“添加”表。

如果您使用的数字是十进制数字或二进制数字,则无关紧要 - 原理相同。

答案 2 :(得分:1)

以下是使用Peasant算法的方法。 add()来自Neera在我面前的回答:

#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;
}

答案 3 :(得分:0)

你可以使用图灵机多个两个数字,可以说不使用任何算术运算符,只需向左/右移动磁带,在磁带上添加/删除标记。因此,您可以编写一个模拟图灵倍增器的C程序。

答案 4 :(得分:0)