Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
b0nny
4 / 2 / 0
Регистрация: 11.11.2013
Сообщений: 347
#1

Нужно исправить умножение столбиком - Программирование Android

11.10.2015, 13:32. Просмотров 267. Ответов 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;
    }
0
Изображения
  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2015, 13:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нужно исправить умножение столбиком (Программирование Android):

Нужно исправить листинг программы или дописать, умножение двочных чисел. - Assembler
&lt;1&gt; ;prg_8_5.asm &lt;2&gt; masm &lt;3&gt; model small &lt;4&gt; stack 256 &lt;5&gt; .data ;сегмент данных &lt;6&gt; rez label word &lt;7&gt; rez_l db 45 &lt;8&gt;...

Вычитание, умножение, деление столбиком - C++
дано мне в классе 2 числа представленные в виде массивов. вот..для них у меня должны быть перегрузки операций сложения,вычитания,умножения...

Умножение столбиком 4ый класс Питерсон - Алгебра
Доброго дня! Учительница по математике выдал &quot;новую&quot; информацию о том как надо умножать столбиком. С ребенком долго мучились. Он не...

Написать калькулятор - сложение, умножение, вычитание, деление столбиком - Pascal ABC
Завтра экзамен, надо сдать три задачи, кто сможет ? 1. Написать калькулятор (сложение, умножение, вычитание, деление столбиком!!) 2....

Решила написать программу сама которая умножение столбиком. Два числа хранятся в массиве - VBA
Помогите найти и исправить ошибку. Sub dlinnoe_na_korotkoe_massiv2() ' ' dlinnoe_na_korotkoe Макрос ' ' MsgBox (&quot;2 массива&quot;) ...

Разработать программу, которая изображает на экране монитора умножение столбиком двух введенных натуральных чисел - C++
С++Builder. Разработать программу, которая изображает на экране монитора умножение столбиком двух введенных натуральных чисел.

4
b0nny
4 / 2 / 0
Регистрация: 11.11.2013
Сообщений: 347
11.10.2015, 13:39  [ТС] #2
А у меня такое добро на втором этапе появляется i = 1...
0
Миниатюры
Нужно исправить умножение столбиком  
b0nny
4 / 2 / 0
Регистрация: 11.11.2013
Сообщений: 347
11.10.2015, 15:56  [ТС] #3
Получил я такой длинный результат по причине того, что в ArrayList добавляются элементы, а не заменяется?
Тогда... вот такой код.
На всём этапе tmp вычисляется верно.
result после всех этапов почему-то я получил... 70400. Это tmp последнего этапа. Это 352*2. И два нуля в конце, чтобы складывать с предыдущим.
от Addition(tmp.size(), sys, temp, n2, tmp, result); мы получили наш result, но похоже он его складывает не с чем... С 0.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
                    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++) // сдвигаем
                        {
                            // Переворачиваем, чтобы добавить в конец числа, а потом обратно
                            Collections.reverse(tmp);
                            tmp.add(0);
                            Collections.reverse(tmp);
                        }
 
                        //n2.clear();
                        n2 = result;
                        result.clear();
                        Addition(tmp.size(), sys, temp, n2, tmp, result);
 
                        // Для проверки на каждом этапе
                        String resultNUMBER = "";
                        for (int jj = 0; jj < result.size(); jj++) {
                            resultNUMBER += Integer.toString(result.get(jj));
                        }
                        Toast.makeText(this, new StringBuilder(resultNUMBER).reverse().toString(), Toast.LENGTH_SHORT).show();
                    }
Добавлено через 55 минут
Всё... Я сделал. Я не правильно копировал n2 = result;
Java
1
2
3
for (int o = 0; o < result.size(); o++) {
 n2.add(result.get(o));
}
0
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 598
11.10.2015, 17:29 #4
Цитата Сообщение от b0nny Посмотреть сообщение
Всё... Я сделал. Я не правильно копировал n2 = result;

Не по теме:

Не очень хорошо использовать о и l, I, для названия переменных, их очень лекго спутать на некоторых шрифтах с 1 и 0 или просто между собой

0
b0nny
4 / 2 / 0
Регистрация: 11.11.2013
Сообщений: 347
12.10.2015, 16:36  [ТС] #5
В умножении фигня происходит
Например для двоичной СС
111
101
----
Умножение крайнего справа разряда на 1-е число 111
2-го на число - 000 должно быть, а получается так, что он вообще не отдаёт значения. Пусто.
Подскажите как исправить...

Добавлено через 17 минут
Решил вот таким стопобом.
Java
1
2
3
4
5
if (sys == 2 && tmp.size() == 0) {
                            for (int t = 0; t < arrayNum1.size(); t++) {
                                tmp.add(0);
                            }
                        }
0
12.10.2015, 16:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2015, 16:36
Привет! Вот еще темы с ответами:

Исправить программу, чтобы ввод данных ввести одной строкой, а не столбиком - Pascal ABC
нужно исправить программу, чтобы ввод данных ввести одной строкой, а не столбиком. unit procedury; interface uses crt,...

Нужно создать файл в который записать столбиком цифры от 1 до n - C++
Создать файл в который записать столбиком цифры от 1 до n

Исправить ошибку (умножение двух матриц) - C++
#include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; void main() { SetConsoleOutputCP(1251); const int s = 2; int...

Умножение матрицы на вектор, исправить код - C#
При выводе координат вектора(выделено красным) мне всегда выдает 0000. какие бы числа не заводила. я уже просто тупо не могу найти ошибку....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.