0 / 0 / 0
Регистрация: 17.12.2011
Сообщений: 67
1

Длинные числа. Умножение отрицательных

29.03.2015, 17:30. Показов 6800. Ответов 43
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, помогите пожалуйста как сделать, чтобы и отрицательные числа перемножались?
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <iostream>
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<string.h>
using namespace std;
 
//Ввод данных
void vvod(char *ar, int  &n)
{
    int i=0;
    printf("\n Введите число: ");
    ar[i]=getchar();
    while(ar[i]!='\n') 
    {
        i++;
        ar[i]=getchar();    
    }
    n=i;
    for(i=0; i<n; i++) ar[i]-=48;
}
void write_num(char *ar, int &n)
{
    int i;
    for(i = 0; i < n; i++)
        printf("%d", ar[i]);    
}
 
void umnogenie(char b[], int &n, char c[], int m)
{
    char h[1000];
    int i,j,l,o;
    
    //Обнуляем резултат
    for(i=0; i<n+m; i++)
         h[i]=0;
    //Умножение
    for(i=0; i<m; i++)
    {
     o=0; l=0;
     for(j=n-1; j>=0; j--) 
     {
        h[j+m-i]+=(b[j]*c[m-1-i] + o)%10;
        if(h[j+m-i]>9) 
         {
             l=h[j+m-i]/10;
             h[j+m-i]=h[j+m-i]%10;
         }
        o=(b[j]*c[m-i-1] + o)/10+l;        
        if(j==0) h[j+m-1-i]+=o;
        l=0;
     }
    }
    //Избавляемся от ведущих нулей
    n=n+m;
    while(h[0]==0)
    {
      for(j=0; j<n-1; j++)
         h[j]=h[j+1];
      if(n!=1) n--; else break;
    }
    //Вывод результата
    for(i=0; i<n; i++)
      b[i] = h[i];
}
 
int main()
{ 
    
    setlocale(LC_ALL,"rus");
    int kol;
    char a[1000], b[1000], c[1000], q[1000];
    int d=0;
    int na, nb, nc, nq; // Число цифр
    cout << "============Простейший калькулятор на умножение в 10 СC============\n";
    cout << "\n Калькулятор предназначен для работы только с цифрами. \n Количество вводимых чисел от 2 до 4. \n Длина вводимого числа должна быть в пределе [-1000000000; 1000000000].\n";
    cout << " Ввод чисел осуществляется через клавишу Enter.\n";
    cout << " Выход из программы по нажатию кнопки 1.\n  ";
do{
        while(true)             
        { 
            printf("\n\n Введите количество чисел: ");
            cin >> kol;
            if((kol==2 || kol==3 || kol==4 || kol==1) && cin.peek() == '\n')
            { 
                cin.get();                      
                break;
            }   
            else
            { 
                cout << "\n Операция вычитания возможна только с 2-4 числами. \n Подсказка: Нажмите цифру 2, 3 или 4. Для выхода нажмите 1. \n" << endl;
                cin.clear();    
                while (cin.get() != '\n'){}
            }
        }
    switch(kol) 
    {
        case 1: 
            return 0;
            break;
        case 2:
            vvod(a, na);
            vvod(b, nb);
            umnogenie(a,na,b,nb);
            printf("\n Результат: ");
            write_num(a,na);
            break;
        case 3:
            vvod(a, na);
            vvod(b, nb);
            vvod(c, nc);
            umnogenie(a,na,b,nb);
            umnogenie(a,na,c,nc);
            printf("\n Результат: ");
            write_num(a,na);
            break;
        case 4:
            vvod(a, na);
            vvod(b, nb);
            vvod(c, nc);
            vvod(q, nq);
            umnogenie(a,na,b,nb);
            umnogenie(a,na,c,nc);
            umnogenie(a,na,q,nq);
            write_num(a,na);
            break;
    }
 }while(d!=1);
    printf("\n\n");
    system ("pause");
    return 0;
}
Добавлено через 7 минут
Здравствуйте. Помогите пожалуйста довести программу до ума.
Задача: Калькулятор на умножение в 10 СС. Диапазон вводимых чисел [-2^256; 2^256]. Умножение от 2 до 4 чисел. Вывод в своей системе и в 18 СС.
Как сделать проверку на вводимый диапазон чисел? И не понимаю как сделать, чтобы и с отрицательными числами программа работала.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2015, 17:30
Ответы с готовыми решениями:

Длинные числа в c++
Делаю прогу, которая работает с длинными числами, хранятся такие числа у меня в классе, в массиве,...

Длинные числа в С++
Я так понемаю самое большое число long long тоесть до милиарда???? а если больше!...

Длинные целые числа
Подскажите пожалуйста как разработать поле типа : длинные целые числа ?

Длинные числа, 3 в 100 степени
Не получается написать такую так как консоль не поддерживает такое количество цифр.

43
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
16.04.2015, 00:21 41
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от flo Посмотреть сообщение
По заданию сказано числа длинной от -2^256 до 2^256.
Для хранения такого числа достаточно использовать 8 переменных типа unsigned + переменная под знак.
Так что ты вообще подразумевала под оптимизацией умножения?
0
0 / 0 / 0
Регистрация: 17.12.2011
Сообщений: 67
16.04.2015, 00:27  [ТС] 42
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Так что ты вообще подразумевала под оптимизацией умножения?
Точно не переписывая код заново)
Подумала, можно ли эти проверки не в main делать, а уже в самой функции умножения.
0
0 / 0 / 0
Регистрация: 17.12.2011
Сообщений: 67
25.04.2015, 20:10  [ТС] 43
В итоге после проделанных тестов программа получилась такая:
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
#include <iostream>
#include "functions.h"
 
using namespace std;
 
//Проверка на диапазон числа 2^256
bool RangeForNumber(char a[], int n)
{
    int i;
    const int nt =85;
    char t[85]={1,1,5,7,9,2,0,9,0,0,};//Cоздание массива числа 2^256
    if (a[0]=='-')
    {
        if(n<=nt) return true;
        if(n>86) return false;
        int neg=1;
        for (i=0;i<n-1;i++)
        {
            if (a[i+1]>t[i]) return false;
            else
            if (t[i]!=a[i+1]) neg=0; 
        }
        if(neg==1) return true;
    }
    if (nt>n) return true;
    if(nt==n && a[0]!='-')
    {
        int pos=1;
        for (i=0;i<n;i++)
        {
            if (a[i]>t[i]) return false;
            else 
            if (t[i]!=a[i]) pos=0;
        }
        if(pos==1) return true;
    }
    return false;
}
 
 
//Проверка на ввод посторонних символов
bool isNumber (char *str, int size)
{
   for (int i = 0; i < size; i++)
   {
      if(i==0 && (int)str[i]==45)
            continue;
        if (str[i] <'0' || str[i]>'9')
            return false;
    }
    return true;
}
//Ввод длинного числа
void InputNumbers(char *ar, int &n)
{
    int i=0;
    bool l=true;
    bool u=true;
    while(true)
    {
        int i=0, j=0,r1=0;
        cout << "\n Введите число: ";
        ar[i]=getchar();
        while(ar[i]!='\n')
        {
            i++;
            ar[i]=getchar();    
        }
        n=i;
        l= isNumber(ar,n);
        for(i=0; i<n; i++)
        {
            if (i==0 && ar[i]=='-')
            {
                ar[i]='-';
            }
            else ar[i]-=48;
        }
        u= RangeForNumber(ar,n);
        if (!l|| !u) 
            cout <<"\n Некорректное значение. Повторите ввод. \n";
        else break;
    }
}
 
//Определение знака
bool DefinitionSign (char b[], int n, char c[], int m)
{
    //Если два числа "-"
    if(b[0]=='-' && c[0]=='-')
    {
        b[0]=b[0]-45;
        c[0]=c[0]-45;
        return true;
    }
    //Если первое число "-", а второе не ноль
    if(b[0]=='-' && c[0]!=0)
    {
        b[0]=b[0]-45;
        return false;
    }
    //Если второе число "-",а первое не ноль
    if(c[0]=='-' && b[0]!=0)
    {
        c[0]=c[0]-45;
        return false;
    }
    return true;
}
 
//Вывод длинного числа
void OutputNumbers(char *ar, int n)
{
    int i;
    if(ar[0]=='-')
    {
        for(i = 1; i < n; i++)
            printf("%d", ar[i]);
    }
    else 
        {
            for(i = 0; i < n; i++)
                printf("%d", ar[i]);
        }
}
 
//Умножение длинных чисел
void Multiplication(char b[], int n, char c[], int m, char e[], int &y)
{
    char h[200];
    int i,j,l,o;
    y=0;
    bool neg=false;
    neg=DefinitionSign(b,n,c,m);
    //Обнуляем результат
    for(i=0; i<n+m; i++)
         h[i]=0;
    //Умножение
    for(i=0; i<m; i++)
    {
        o=0; l=0;
        for(j=n-1; j>=0; j--) 
        {
            h[j+m-i]+=(b[j]*c[m-1-i] + o)%10;
            if(h[j+m-i]>9) 
            {
                l=h[j+m-i]/10;
                h[j+m-i]=h[j+m-i]%10;
            }
            o=(b[j]*c[m-i-1] + o)/10+l;        
            if(j==0) 
            {
                h[j+m-1-i]+=o;
            }
            l=0;
        }
    }
    //Избавляемся от ведущих нулей
    n=n+m;
    while(h[0]==0)
    {
        for(j=0; j<n-1; j++)
        {
            h[j]=h[j+1];
        }
        if(n!=1) 
        {
            n--;
        }
        else break;
    }
    y=n;
    //Если одно из множителей "-"
    if(!neg)
    {
        e[0]='-';
        for(i=0; i<y; i++)
        {
            e[i+1] = h[i];
        }
        y=y+1;
    }
    else
    //Вывод результата
    for(i=0; i<y; i++)
        e[i] = h[i];
}
//Преобразование в тип string
string IsCHARtoSTRING(char *e, int y)
{
    char *temp;
    string t;
    int w;
    temp = new char[y];
    if(e[0]=='-')
    {
        for(w = 0; w < y-1; ++w) 
            temp[w] = e[w+1] + 48;
        y=y-1;
    }
    else
        {
            for(w = 0; w < y; ++w) 
                temp[w] = e[w] + 48;
        }
    t = string(temp, y);
    return t;
}
 
//Перевод в систему счисления по основанию 18
string into18system(string a)
{
    string rez = a; 
    string result;  
    bool negNumber = false;
    if (a[0] == '-')
    {
        negNumber = true;
        rez.erase(rez.begin());
    }
    unsigned int i = 0;
    int ost = 0;        
    string div;                     
    while (!rez.empty())
    {
        for (i = 0; i < rez.size(); i++)
        {
            ost = ost * 10 + (int)rez[i] - 48;
            
            if (ost < 18)
            {
                if (div.size() != 0)
                {
                    div.append("0");
                }
            }
            else
            {
                div = div + (char)(ost / 18 + 48);
                ost = ost % 18;
            }
        }
        if (ost > 9)
        {
            result = (char)(ost + 55) + result;
        }
        else
        {
            result = (char)(ost + 48) + result;
        }
        rez = div;
        div.erase();
        ost = 0;
    }
    if (negNumber)
    {
        result = "-" + result;
    }
    return (result);
}
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
120
121
122
123
#include <iostream>
#include "functions.h"
#include <string>
 
using namespace std;
 
int main()
{ 
    setlocale(LC_ALL,"rus");
    int kol;
    int k=0;
    int y;
    char a[100], b[100], c[100], q[100],e[100];
    string t;
    int d=0;
    int na, nb, nc, nq; // Длина чисел
    cout << "============Простейший калькулятор на вычитание в 10 СC============\n";
    cout << "\n Калькулятор предназначен для работы только с цифрами. \n Количество вводимых чисел от 2 до 4. \n Длина вводимого числа должна быть в пределе [-2^256; 2^256].\n";
    cout << " Ввод чисел осуществляется через клавишу Enter.\n";
    cout << " Выход из программы по нажатию кнопки 1.\n  ";
    do{
        while(true)             
        { 
            cout << "\n Введите количество чисел: ";
            cin >> kol;
            if((kol==2 || kol==3 || kol==4 || kol==1) && cin.peek() == '\n')
            { 
                cin.get();                      
                break;
            }   
            else
            { 
                cout << "\n Операция вычитания возможна только с 2-4 числами. \n Подсказка: Нажмите цифру 2, 3 или 4. Для выхода нажмите 1. " << endl;
                cin.clear();    
                while (cin.get() != '\n'){}
            }
        }
        
    switch(kol) 
    {
        case 1: 
                return 0;
            break;
        case 2:
                InputNumbers(a, na);
                InputNumbers(b, nb);
                Multiplication(a,na,b,nb,e,y);
                if(e[0]=='-')
                        cout << "\n Результат в 10 СС: -";
                else
                    cout << "\n Результат в 10 СС: ";
                OutputNumbers(e,y);
                t=IsCHARtoSTRING(e,y);
                if(e[0]=='-')
                {
                    cout << "\n Результат в 18 СС: -";
                }
                else 
                {
                    cout << "\n Результат в 18 СС: ";
                }
                cout << into18system(t) << endl;
                if(e[0]=='-')
                {
                    cout << " Результат в 35 СС: -";
                }
                else 
                    cout << " Результат в 35 СС: ";
                cout << into35system(t) << endl;
            break;
        case 3:
                InputNumbers(a, na);
                InputNumbers(b, nb);
                InputNumbers(c, nc);
                Multiplication(a,na,b,nb,e,y);
                Multiplication(e,y,c,nc,e,y);
                if(e[0]=='-')
                    cout << "\n Результат в 18 СС: -";
                else 
                    cout << "\n Результат в 18 СС: ";
                OutputNumbers(e,y);
                t=IsCHARtoSTRING(e,y);
                if(e[0]=='-')
                    cout << "\n Результат в 18 СС: -";
                else 
                    cout << "\n Результат в 18 СС: ";
                cout << into18system(t) << endl;
                if(e[0]=='-')
                    cout << " Результат в 35 СС: -";
                else 
                    cout << " Результат в 35 СС: ";
                cout << into35system(t) << endl;
            break;
        case 4:
                InputNumbers(a, na);
                InputNumbers(b, nb);
                InputNumbers(c, nc);
                InputNumbers(q, nq);
                Multiplication(a,na,b,nb,e,y);
                Multiplication(e,y,c,nc,e,y);
                Multiplication(e,y,q,nq,e,y);
                if(e[0]=='-')
                        cout << "\n Результат в 10 СС: -";
                else
                    cout << "\n Результат в 10 СС: ";
                OutputNumbers(e,y);
                t=IsCHARtoSTRING(e,y);
                if(e[0]=='-')
                    cout << "\n Результат в 18 СС: -";
                else 
                    cout << "\n Результат в 18 СС: ";
                cout << into18system(t) << endl;
                if(e[0]=='-')
                    cout << " Результат в 35 СС: -";
                else 
                    cout << " Результат в 35 СС: ";
                cout << into35system(t) << endl;
            break;
    }
 }while(d!=1);
    system ("pause");
    return 0;
}
И мне стало интересно, можно ли переделать умножение, чтобы значение возвращалось. Прочитала, что в массивах сам массив не возвращается, а возвращается только указатель на элементы массива. Не понятно как в дальнейшем работать.
Попробовала в тип string переделать, вопрос появился, а как тогда будет умножение происходить 3 или 4 чисел?
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
25.04.2015, 22:53 44
Цитата Сообщение от flo Посмотреть сообщение
Не понятно как в дальнейшем работать.
Можно на вход функции передавать два множителя и массив, куда будет помещаться результат.
Можно внутри функции умножения динамически выделять память под результат и возращать на него указатель.
Но динамически выделенную память всегда нужно освобождать, так что советую создать класс-обертку вокруг массива, который собственно и будет заниматься выделением и освобождением памяти из под массива, либо использовать некоторую стандартную обертку.
Цитата Сообщение от flo Посмотреть сообщение
Попробовала в тип string переделать
Это как раз разновидность той самой "обертки", где динамически выделяется память под массив чаров, где будет храниться строка.
0
25.04.2015, 22:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2015, 22:53
Помогаю со студенческими работами здесь

Как сравнить длинные числа через list?
Знаю, как это сделать с помощью vector, а вот с list, увы нет. Вот код с попощью vector, может...

Реализовать длинные целые числа в виде класс
здравствуйте,только начала изучение классов,помогите с решением задачи:нужно реализовать длинные...

Определить наибольший общий делитель двух многоразрядных чисел (длинные числа)
Определить наибольший общий делитель двух многоразрядных чисел. Для хранения многоразрядного числа...

Длинные числа
Здравствуйте, прошу помогите переделать умножение и деление, неправильно работает например 555*3...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru