Реализация «умножения русского крестьянина с использованием Java» - PullRequest
0 голосов
/ 26 ноября 2018

Вот код, который я написал: я начинающий программист, и я не очень эффективен в коде.Может кто-нибудь проверить, могу ли я его улучшить?

Вот ссылка на метод: 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 голосов
/ 26 ноября 2018

Вам не нужно помещать элементы в массивы и т. Д. Вы можете использовать побитовые операции и обновлять аккумуляторы, например:

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 равен нулю (и, таким образом, все установленные биты «сдвинуты»).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...