用java实现“俄罗斯农民乘法”

时间:2018-11-25 22:08:51

标签: java algorithm math

这是我编写的代码:我是一个初学者,对代码的效率不是很高。谁能检查我是否可以改善它?

以下是方法的链接:https://en.wikipedia.org/wiki/Ancient_Egyptian_multiplication#Russian_peasant_multiplication

public static long RussianPeasantMult(long a, long b)
    {   
        int arraylen=1000;
        long[][] results= new long[2][arraylen];
         results[0][0]=a;
         results[1][0]=b;
         int index=1;

         while(results[0][index-1]!=1)
         {
             results[0][index]=results[0][index-1]/2;
             results[1][index]=results[1][index-1]*2;
             index++;
         }
         long sum=0;
         for (int i=0;i<arraylen;i++)
         {
             if(results[0][i]%2==1)
                 sum=sum+results[1][i];
         }
         return sum;
    }

1 个答案:

答案 0 :(得分:1)

您不需要将元素放入数组等中。您可以使用按位运算,并更新累加器,例如:

public static long RussianPeasantMult(long a, long b) {
    long sum = 0;
    while(a != 0) {
        if((a & 1) == 1) {
            sum += b;
        }
        a >>>= 1;
        b <<= 1;
    }
    return sum;
}

因此,在每次迭代中,我们检查是否设置了最后一位。如果已设置,我们将b加到总和上。无论最后一位如何,我们都将a移到右侧一个位置,并将b移到左侧一个位置。我们可以从a为零的那一刻开始停止(因此所有设置的位都“移出”了。)