Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/96: Рейтинг темы: голосов - 96, средняя оценка - 4.67
5 / 5 / 1
Регистрация: 10.03.2012
Сообщений: 121

Умножение двух чисел в столбик

03.04.2013, 23:28. Показов 20642. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, товарищи! Вроде бы задание простое, но я в тупике, просто не пойму как начать.

Нужно умножить два числа, не используя векторы.
Вот начал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
void main()
{
    int len_a = 3;
    int len_b = 2;
 
    int a[5] = {4, 2, 7};
    int b[4] = {3, 6};
    int *c = new int[256];
}
Добавлено через 23 секунды
что дальше не пойму
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.04.2013, 23:28
Ответы с готовыми решениями:

Умножение и сложение в столбик двух чисел без использования массива
Здравствуйте, уважаемые. Нужно написать код для умножения и сложения в столбик двух чисел без использования массива. Уже битый час бьюсь...

Умножение двух больших чисел
дано два 40 значных числа,нужно перемножить их http://e-maxx.ru/algo/big_integer от сюда и других тем с данного форума код не подходит....

Умножение двух длинных чисел
Приветствую, помогите исправить процедуру умножения двух длинных чисел: void CALL_TYPE Multiply(unsigned char *u,int N, unsigned char...

10
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
03.04.2013, 23:40
Запиши два числа порозрядно в массивы.
Затем определи число которое больше это будет число которое ты как бы запишешь в верху первое число.
От второго числа возьми последний разряд и умножай на разряды первого числа, проверку делай если число будет больше или равно десяти, то к следующему числу мы должны добавить единицу. И так для каждого разряда.
Получившиеся числа просто суммируй это и есть результат.
Словами ты фиг чо поймешь, а писать мне код лень.
2
5 / 5 / 1
Регистрация: 10.03.2012
Сообщений: 121
04.04.2013, 02:59  [ТС]
Цитата Сообщение от ninja2 Посмотреть сообщение
Словами ты фиг чо поймешь, а писать мне код лень.
а как сделать смещение? вот как на этой картинке, 2ку сносим, остальное плюсуем?

Название: multi-column7.jpg
Просмотров: 1785

Размер: 34.2 Кб
0
5 / 5 / 1
Регистрация: 10.03.2012
Сообщений: 121
04.04.2013, 13:04  [ТС]
подскажите хотя бы идею, как это реализовать
0
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
04.04.2013, 14:41
Я недавно делал это вручную перемножал когда класс создавал для громадных int там умножение вручную есть в функции перегрузка operetor*(); Примеров как именно перемножать я нигде не видел.
отут в функции operator*() в классе я перемножал в столбик. http://www.kselax.ru/2013/03/klass-lint/ но ты фиг там поймешь, а объяснять либо самому тебе перемножить мне лень. Проще тебе самому пару раз умножить и написать по алгоритму программу.

Добавлено через 8 минут
Вообще пару раз умнож число вручную и уже пиши по алгоритму это будет лучший вариан.
Что тебе нужно для начала? Правильно определить какое число больше.
Потом что еще? Да нужно взять последнюю цифру меньшего числа. Ну делай бери ее выдели как небуть с массива.
Потом что? Перемножать разряды с проверкой. ты взял перемножи у тебя получилось число. проверь его больше оно или равно десяти. Если число больше или равно десяти, то раздели его на десять ты получишь число которое нужно будет прибавить при следующем умножении, либо если умножения не будет дописать к множителю в первые разряды добавить так сказать, и взять конечно остаток от деления чтобы снести сам разряд вниз.
Просто так фиг ты что разберешь.
Мой совет вручную перемно а затем уже выдели алгоритм и по нему пиши. exit(1); используй для пошаговой проверки что ты получаешь, на каждом шаге выполнения программы.

Добавлено через 26 минут
Я начало тебе уже сделал. Отак должно быть сначала. Ты просто перемножь и суму сложи с проверкой условия.
C++
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
using std::cout;
using std::endl;
#include <cstdlib>
using std::exit;
 
int main()
{
    int chislo1[20]={0};
    int chislo2[20]={0};
    int a=340;
    int b=25;
    int r1;//razr9d pervui
    int r2;//razr9d vtoroi
    //zapicuvaem pervoe chiclo
    for(int i=0;a!=0;i++)
    {
        int d=a%10;
        a/=10;
        chislo1[i]=d;
    }
    //zapicuvaem vtoroe chiclo vo vtoroi massiv
    for(int i=0;b!=0;i++)
    {
        int d=b%10;
        b/=10;
        chislo2[i]=d;
    }
    //exit(1);
    int i=19;
    for(;chislo1[i]==0;i--);
    //cout <<i<<endl;
    //exit(1);
    r1=i;
    //vuvodim polychivcheec9 chislo
    for(;i>=0;i--)
        cout <<chislo1[i]<<' ';
    cout <<endl;
    //vuvod vtorogo chicla
    i=19;
    for(;chislo2[i]==0;i--);
    r2=i;
    for(;i>=0;i--)
        cout <<chislo2[i]<<' ';
    cout <<endl;
    
    
    //peremnojaem
    for(i=0;i<=r2;i++)
    {
        cout <<"peremnojaem"<<endl;
        for(int j=0;j<=r1;j++)
        {
            cout <<chislo1[j]<<"*"<<chislo2[i]<<endl;;
            //cout <<chislo2[i];
        }
    }
}
Просто там отлаживать дофига нужно. exit(1); дофига использовать нада.

Добавлено через 32 секунды
будем считать, что число a всегда больше числа b;

Добавлено через 9 минут
Та пытался полностью сделать там головняк вспомнил там тебе еще нужно и сложение делать. Сначала напиши функцию которая будет складывать два массива, и возвращать третий, а затем уже умножай. Но это трудная задача. Если ты не сильно шаришь, то даже не пытайся делать виг чо сделаешь.
1
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
04.04.2013, 18:27
Цитата Сообщение от PlayaRC Посмотреть сообщение
int *c = new int[256];
во-первых максимальная длина c равна произведению длин множителей.
1
5 / 5 / 1
Регистрация: 10.03.2012
Сообщений: 121
17.04.2013, 17:16  [ТС]
взял в пример картинку из поста 3 и написал следующий код:

Кликните здесь для просмотра всего текста
C++
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
26
27
28
29
30
31
32
33
34
#include "stdafx.h"
#include <iostream>
using namespace std;
 
void main()
{
    int len_a = 3, len_b = 2;
    int a[3] = {4,2,7};
    int b[2] = {3,6};
    int *temp = new int; 
    int *c = new int [len_a + len_b];
 
    for(int i=0; i<10; i++)
        temp[i]=0;
    int k=0;
    for(int i=len_b-1; i>=0; i--)
    {
        for(int j=len_a-1; j>=0; j--)
        {
            temp[k]+=(b[i]*a[j])%10;
            if((b[i]*a[j])>9)
                temp[k+1]=(b[i]*a[j])/10;
            k++;
        }
        k++;
    }
 
 
 
    for(int i=7; i>=0; i--)
        cout<<temp[i]<<" ";
    cout<<endl;
    system("pause");
}


в итоге в одном массиве у меня получается 12812562. Вопрос, как сделать чтобы они складывались сразу, ведь если второе число будет трехзначное, то и чисел будет три
0
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
17.04.2013, 19:21
Создай функцию которая будет складывать два массива. От например summ(int mass1[],int mass2[]); массив по ссылке передается вызови ее отак summ(result[],temp1[]); Все у тебя в result[] должно остаться значение массива temp1, токо result[] сначала нулевой. Это при первом проходе туда запишется значение которое получится при умножении на первый разряд множетеля, при втором проходе уже к значению первого числа прибавиться значение числа которое получилось при умножении второго разряда множителя и.т.д. Я ж уже тебе писал.

Добавлено через 2 минуты
Вручную прибав два числа и функцию напиши по алгоритму. Раз уже разобрался как умножать, то прибавить два числа легче.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
22.04.2013, 10:51
Цитата Сообщение от taras atavin Посмотреть сообщение
во-первых максимальная длина c равна произведению длин множителей.
Во-первых, сумме, а не произведению. "Во-вторых" ещё не придумал.
1
0 / 0 / 0
Регистрация: 17.12.2017
Сообщений: 1
17.12.2017, 18:14
Понадобилось написать такую-же программу и вот поделюсь

C++
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
//=== подключаемые модули ===
#include "stdafx.h"
#include <iostream>
 
//=== глобальные переменные для удобства ===
int a,b; //от –2147483648 до  2147483647
char aa = -1,bb = -1; //чтобы сохранить знаки введеных чисел и не засорять ими промежуточный вывод
unsigned char b_array[]={0,0,0,0,0,0,0,0,0,0}; //будет использоваться для парсинга числа b на отдельные разряды. Потому берем минимальный тип char. А так как мы будем использовать только положительное число для работы (в дальнейшем это сделаем), то возьмем только НЕотрицательные, т.е. unsigned char
__int64 tmp_array[]={0,0,0,0,0,0,0,0,0,0}; //при умножении integer на какое-либо число, может получиться результат больше integer и возникнет переполнение, потому сразу обговорим использование __int64 (диапазон -9223372036854775808 .. 9223372036854775807)
 
//=== Функция: возведение 10 в степень. Для удобства. Можно воспользоваться функцией pow, но для этого придется подключать библиотеку cmath и не уверен, что она нормально будет работать с числами типа __int64
__int64 ten(int value) //value - номер степени
{
    __int64 tmp = 1; //так как будем получать степень 10, т.е. 10^0=1, 10^1=10 и т.д., то сразуопределим крайнее значение при возведении в нулевую степень.
 
    while (value != 0) 
    {
        tmp = tmp*10; //умножаем на 10 пока не кончится число степени
        value--; 
    }
    return tmp;
}
 
//=== функция расчета длины числа, необходимо для красивого вывода в столбцах ===
int lengthint(__int64 value)
{
    int tmp=0;
    if (value == 0) tmp=1; //если число 0, то его длина тоже 1 и это крайний случай, который не подходиьт под дальнейший алгоритм
 
    while (value!=0) //если же изначально число не нуль, то делим его на 10 и считаем число разрядов
    {
        value = value / 10;
        tmp++;
    }
    return tmp; //возвращаем число разрядов
}
 
//=== читаем с клавиатуры два числа ===
void readnum(void)  //читаем с клавиатуры два числа
{
    printf ("Please write first number a="); //просим ввести с клавиатуры первое число
    scanf_s("%d",&a); //сохраняем его в переменную а. scanf_s используем потому что среда ругается на не безопасный ввод, возможно на более старых студиях (vs2008) можно и scanf юзать
    printf ("Please write second number b="); //просим ввести второе число
    scanf_s("%d",&b); //сохраняем в переменную b.
 
    //далее вывод двух чисел с учетом их длины и знака, опишу для одного подробно
    for(int i=0;i<20-lengthint(a);i++) printf (" "); //нам необходимо отступить слева определенное количество пробелов, чтобы сделать грамотный столбик. Мы отступаем 20-(длина числа а)
    if(a>=0) //если число положительное
    {
        printf (" "); //место под знак не нужно и мы заполняем его еще одним пробело
        aa = aa*-1; //у нас были переменные для сохранения информации для знака, это aa и bb. Изначально мы их задали сразу -1 и -1 соответственно. Если число положительное, здесь, когда мы провалились в условие, что число положительное, то мняем знак числа в переменной аа на положительный. Мне показалось так проще
    }
    printf ("%d\n",a); //выводим число а вместе со знаком
 
    for(int i=0;i<20-lengthint(b);i++) printf (" "); //аналогично предыдущему
    if(b>=0)
    {
        printf (" ");
        bb = bb*-1;
    }
    printf ("%d\n",b);
 
    a=abs(a); //так как мы будем промежуточный результат выводить без учета знака, то возьмем модули чисел. Заранее сохранив знаки в переменных аа и bb
    b=abs(b);
 
    printf ("  -------------------\n"); //подчеркивание после вывода чисел
}
 
//=== функция парсинга числа b по разрядам в массив.
void parsenum(int temp_b) //парсим значения поразрядно только для второго числа
{
    int num=0; //счетчик
    while (temp_b!=0) //пока число не кончилось во время его распила
    {
        b_array[num] = temp_b % 10; //сохраняем младший разряд
        temp_b = temp_b / 10; //удаляем его из числа b, деля на 10 целочисленно
        num++;
    }
}
 
//=== функция рассчета и всей производящейся математики ===
void math(void)
{
    __int64 tmp=0; //переменная для хранения результата выполнения операций
 
    for(int i=0; i<lengthint(b);i++) //цикл расчета и вывода промежуочных результатов, пробигая по всей длине числа b
    {
        tmp_array[i] = (__int64)(a) * b_array[i]; //мы умножаем первое число a последовательно на каждый разряд числа b. Чтобы избежать переполнения int, расширим число a до __int64
        for(int j=0;j<21-lengthint(tmp_array[i])-i;j++) printf (" "); //как и было ранее, красивый вывод, только уже промежуточной строки с особенностью. Здесь нет проверки наличия знака, т.к. мы работаем с НЕотрицательными числами. Начальное значение сдвига строки 21, а не 20. Далее из него вычитаем длину выводимого числа (как и в случаях с а и b), а потом еще вычитаем разряд числа b, т.к. при умножении столбиком каждое следующее действие сдвигается на один разряд влево (не знаю ккак лучше это описать, но думаю и так понятно)
        printf ("%I64d\n",tmp_array[i]); //выводим промежуточное число. обычно для int используется форматированный вывод %d, но мы используем переменную __int64, а для нее вывод %I64d
    }
 
    printf ("  -------------------\n"); //когда все промежуточные результаты выведены, рисуем черту
 
    for(int i=0; i<lengthint(b);i++) //т.к. мы хотим показать, что все используемые промежуточные значения были полезны, мы же не выведем просто результат a*b, а проведем сложение, как стандартном случае правила сложения столбиком
    {
        tmp = tmp + (__int64)(tmp_array[i])*ten(i); //в tmp будем складывать все значения. Опять расширим до __int64, чтобы избежать переполнения int (т.е. в операции мы используем два числа int, то результат сначала будет int, а только потом он попадет в переменную __int64. А если одна из переменных принципиально будет __int64, а вторая int, то результат уже будет __int64 на этапе умножения). Здесь используем нашу функцию, описанную выше - возведенеие 10 в степень (т.к. мы просто умножали разряд числа b на число a, настало время учитывать разряд числа b)
    }
    
    for(int i=0;i<20-lengthint(tmp);i++) printf (" "); //опять хитрый вывод результата (по аналогии с выводом a и b)
    tmp = tmp*aa*bb; //нужно вспомнить знак результата. Для этого нужно перемножитьднаки исходных множителей, для чего их и сохраняли
    if(tmp>=0) //стандартная уже для нас проверка: нужно ли оставить место под знак "-" при выводе числа
    {
        printf (" "); //если не нужно, то заполняем пробелом
    }
    printf ("%I64d\n",tmp);//выводим результат
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    readnum(); //вызываем функцию чтения с клавиатуры чисел и их вывода
    
    parsenum(b); //вызов функции парсинга числа b
 
    math(); //вся обработка и вывод промежуточных результатов и итога
 
    system("pause"); //ждем any key
    return 0;
}
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,279
17.12.2017, 20:54
Цитата Сообщение от PlayaRC Посмотреть сообщение
Нужно умножить два числа, не используя векторы.
C++
1
2
3
4
5
6
7
8
int x = 427;
int y = 36;
int rez = 0;
 
for(int i = 0; i < x; i++) 
{
    rez += y;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.12.2017, 20:54
Помогаю со студенческими работами здесь

Реализовать умножение двух длинных чисел
Не могу никак разобраться, знаю, что решать надо с помощью строк и все. Помоги пожалуйста Реализовать умножение двух длинных...

Строки char: умножение двух чисел
нужно было создать функцию, умножающую два числа (до 30 цифр включительно). эти числа - два char массива. есть один момент, с которым...

Умножение двух чисел в двоичной системе счисления
Всем доброго времени суток! Мучаю эту программу уже который день, но правильно она складывать числа в двоичной системе счисления...

Длинная арифметика: умножение двух длинных чисел
Всем привет! Снова к Вам за помощью. Алгоритм умножения двух длинных чисел: void...

Длинная арифметика. Умножение двух длинных чисел.
Есть 2 числа, храняющиеся в int векторах, нужна функция, которая возвращает их произведение также в виде вектора. Либо простой и понятно...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru