这是我编写的代码:我是一个初学者,对代码的效率不是很高。谁能检查我是否可以改善它?
以下是方法的链接: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;
}
答案 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
为零的那一刻开始停止(因此所有设置的位都“移出”了。)