11.10.2015, 13:32. Просмотров 281. Ответов 4
Помогите исправить умножение столбиком. C Multiply - всё чётко. Получаем результат умножения текущего разряда (2-го числа) на первое число.
Далее в конец числа добавляем 0. Ниже я отобразил где это происходит, я поставил там звёздочку *.
Картинка 1
n2 = result - ArrayList - на начальном этапе ничего не имеет в себе.
Функция - Addition(отдаёт обратно result) складывает два числа. Я складываю n2 (которое равно = rusult) и tmp.
Для интереса в конце написал if (i == 0) break; , чтобы посмотреть результат. result я получаю - 1056, т.к. сложило tmp = 1056 + 0000 (ибо сначала он ничему не равен).
Если дальше, то
Картинка 2
Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| ArrayList<Integer> tmp = new ArrayList<Integer>();
ArrayList<Integer> n2 = new ArrayList<Integer>();
for (int i = 0; i < arrayNum1.size(); i++)
{
tmp = Multiply(arrayNum1, arrayNum2.get(i), sys); // умножаем текущий разряд числа на другое длинное число
for (int j = 0; j < i; j++) // сдвигаем
{
// Переворачиваем, чтобы добавить в конец числа 0, а потом обратно
Collections.reverse(tmp);
tmp.add(0);
Collections.reverse(tmp);
}
n2 = result;
Addition(tmp.size(), sys, temp, n2, tmp, result);
//if (i == 0) break;
} |
|
Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| public static ArrayList<Integer> Multiply(ArrayList<Integer> num1, int value, int sys) {
int temp = 0;
ArrayList<Integer> ans = new ArrayList<Integer>();
for (int i = 0; i < num1.size(); i++) {
long tmp = (long) num1.get(i) * (long) value + temp;
ans.add((int) (tmp % sys));
temp = (int) (tmp / sys);
}
ans.add(temp);
// Удаляем лишние нули
while (ans.size() > 0 && ans.get(ans.size() - 1) == 0) {
ans.remove(ans.size() - 1);
}
return ans;
} |
|
Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| public static ArrayList<Integer> Addition(int length, int sys, int temp, ArrayList<Integer> num1, ArrayList<Integer> num2, ArrayList<Integer> result) {
for (int i = 0; i < length; i++) {
int tempA = (num1.size() > i) ? num1.get(i) : 0; // Временное значение i-го разряда из первого числа
int tempB = (num2.size() > i) ? num2.get(i) : 0; // Временное значение i-го разряда из второго числа
result.add(tempA + tempB + temp);
if (result.get(i) >= sys) {
result.set(i, result.get(i) - sys);
temp = 1;
} else {
temp = 0;
}
}
// Увеличиваем массив
if (temp == 1) {
result.add(temp);
}
return result;
} |
|