二进制乘法 - Peasant算法

时间:2011-11-05 08:11:36

标签: java algorithm recursion

我在十进制数字上尝试了二进制乘法技术。

算法:

要将两个十进制数x和y相乘,请将它们分别写在每个数字旁边 其他,如下例所示。然后重复以下步骤:将第一个数除以2, 向下舍入结果(即,如果数字是奇数则丢弃:5),然后加倍 第二个数字。继续前进,直到第一个数字下降到1.然后删除所有行 其中第一个数字是偶数,并加上第二列中剩余的数字。

11 13

5 26

2 52

1 104

........

143(回答)

代码:

class Multiply
{
static int temp;
static int sum;

public static void main(String[] args)
{
    int x = Integer.parseInt(args[0]);
    int y = Integer.parseInt(args[1]);
    int ans = multiply(x , y);
    System.out.println(ans);
}
public static int multiply(int x, int y)
{
    if(x==1)
    {
        System.out.println(x+" : "+y);
        return y;
    }


    temp = multiply(x/2, y*2);

    if(x%2==0)
    {
        System.out.println(x+" : "+y);
        return temp;
    }
    else
    {
        System.out.println(x+" : "+y);
        sum = sum+temp;
        return sum;
    }
}
}

我认为递归有些问题,但我找不到它是什么!!

6 个答案:

答案 0 :(得分:6)

进行递归时,不要在递归方法之外使用变量。这太令人困惑了。我的意思是递归方法应该是自包含的。这是您的程序的工作版本:

public class Main {

    public static void main(String[] args) {
        int x = 11;
        int y = 13;
        int ans = multiply(x, y);
        System.out.println(ans);
    }

    public static int multiply(int x, int y) {
        if (x == 1) {
            return y;
        }    

        int temp = multiply(x / 2, y * 2);
        if (x % 2 != 0) {
            temp += y;
        }

        return temp;
    }
}

答案 1 :(得分:4)

你的递归应该是这样的 -

public class Multiply {
    static int temp = 0;
    static int sum = 0;

    public static void main(String[] args) {
        int x = Integer.parseInt("11");
        int y = Integer.parseInt("9");
        int ans = multiply(x, y);
        System.out.println(ans);
    }

    public static int multiply(int x, int y) {
        if (x == 1) {
            System.out.println(x + " : " + y);
            return sum + y;
        }
        if (x % 2 == 0) {
            System.out.println(x + " : " + y);
        } else {
            System.out.println(x + " : " + y);
            sum = sum + y;
        }
        return multiply(x / 2, y * 2);
    }
}

答案 2 :(得分:3)

我无法抗拒将它发布在一行

public static int multiply(int x, int y) {
    return ((x & 1) > 0 ? y : 0) + ((x & ~1) > 0 ? multiply(x >> 1, y << 1) : 0);
}

答案 3 :(得分:2)

我无法抗拒添加迭代解决方案:快速,简单且有效 对于否定论点:

int product(int x, int y) {
    boolean positive = x >= 0;
    int p = 0;
    while (x != 0) {
        if (x % 2 != 0) p += y;
        x /= 2;
        y *= 2;
    }
    return positive ? p : -p;
}

答案 4 :(得分:2)

这是一个简单的Java实现,它在没有乘法运算符的情况下进行乘法运算。

public static int multiply(int a, int b) {
    int p = 0;
    // If a is odd number. 
    if ((a & 1) > 0) {
        p = b;
    } //else use the default value in the p.

    // If 'a' contains any number larger than one
    // than continue recursion.
    if (a > 1)
        p = p + multiply(a >> 1, b << 1);
    return p;
}

答案 5 :(得分:0)

public static int multiply(int x, int y) {
    if (y == 0 || x == 0) {
        return 0;
    }
    if (x == 1) {
        return y;
    } else {
        return multiply(x >> 1, y << 1);
    }
}