Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 26.03.2017
Сообщений: 32
1

Сложить два длинных числа

16.08.2018, 00:43. Показов 1808. Ответов 7
Метки нет (Все метки)

Есть класс Decimal который наследует виртуальную функцию сложения массивов от базового класса. В классе есть массив типа unsigned char. Необходимо сложить эти два массива. Задача на подобии сложения двух длинных чисел. Перепробовал уже много арифметики длинных чисел но после сложения он мне в качестве результата постоянно выводит чертовы смайлики на местах где должны быть цифры. Складывает коды символов вместо того чтобы складывать их как числа

Класс:
C++
1
2
3
4
5
6
7
8
class Decimal : public Array
{
public:
    Decimal();
    void enterArray();
    void showArray();
    void arrayPlus(Decimal &D);
};
Метод сложения:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void Decimal::arrayPlus(Decimal &D)
{
    unsigned char result[maxSize];
 
    unsigned mod = 0;
    size = (size < D.size) ? D.size : size;
    for (unsigned i = 0; i < size; ++i)
    {
        result[i] = arr[i] + D.arr[i] + mod;
        mod = result[i] / 10;
        result[i] %= 10;
    }
    if (mod)
    {
        result[size++] = 1;
    }
 
    cout << result;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Decimal dec2Arr;
                Decimal dec3Arr;
                p = &dec2Arr;
                p->enterArray();
                p = &dec3Arr;
                p->enterArray();
                cout << endl;
 
                cout << "Первый массив: ";
                p = &dec2Arr;
                p->showArray();
                cout << "Второй массив: ";
                p = &dec3Arr;
                p->showArray();
                cout << endl;
 
                //cout << dec2Arr.arrayPlus(dec3Arr) << endl << endl;
                dec2Arr.arrayPlus(dec3Arr);
                system("pause");
                break;
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.08.2018, 00:43
Ответы с готовыми решениями:

Программа, которая вычитает два длинных числа
Оба числа находятся в массиве. примерно 100 разрядные. То есть вычитание столбиком.

Сложить два числа в одно
Здравствуйте, есть два числа в каждом может бить цифра от 1 до 20, пример 5 17 Возможно ли эти...

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

Как сложить два числа
как сложить два числа в с++

7
278 / 250 / 209
Регистрация: 14.11.2016
Сообщений: 948
16.08.2018, 11:56 2
C++
1
2
3
4
unsigned char arr[N]{};
// ...
for (unsigned i{}; i < N; ++i)
    std::cout << unsigned(arr[i]);
1
Диссидент
Эксперт C
26354 / 16360 / 3558
Регистрация: 24.12.2010
Сообщений: 36,228
16.08.2018, 12:22 3
Ruprecht Kraus, а что у вас хранится в массиве? Символы ('0', '1' ... '9') или значения цифр (0,1, ... 9)? Если таки символы с кодами 48, 49 ... 57, то совершенно не удивительно, что вы получаете ахинею.
0
0 / 0 / 0
Регистрация: 26.03.2017
Сообщений: 32
17.08.2018, 16:20  [ТС] 4
Цитата Сообщение от Байт Посмотреть сообщение
Ruprecht Kraus, а что у вас хранится в массиве? Символы ('0', '1' ... '9') или значения цифр (0,1, ... 9)? Если таки символы с кодами 48, 49 ... 57, то совершенно не удивительно, что вы получаете ахинею.
Массив я ввожу через string чтобы узнать длину строки:
C++
1
2
3
4
5
6
7
8
9
void Decimal::enterArray() 
{
    string str;
    cout << "Введите массив: ";
    cin >> str;
    size = str.size();
    for (int i = 0; i < size; i++)
        arr[i] = str.at(i);
}
0
Диссидент
Эксперт C
26354 / 16360 / 3558
Регистрация: 24.12.2010
Сообщений: 36,228
18.08.2018, 10:37 5
Ruprecht Kraus, таки символы. И оперируете их КОДАМИ. Код символа '0' есть 48. И так далее.
'0' + '1' = 48 + 49 = 9710 = 6116 - это код символа 'a'

Добавлено через 5 минут
Попробуйте строчки 9-11 переписать так
C++
1
2
3
r = (arr[i]-'0') + (D.arr[i] - '0') + mod;
mod = r / 10;
result[i] = r%10 + '0';
Хотя, конечно, лучше сразу держать в строке сами числа 0, 1,... 9, а не коды цифр.
0
151 / 143 / 87
Регистрация: 13.06.2018
Сообщений: 626
18.08.2018, 11:22 6
как-то так:
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
   string s1;//="987654321123456789";
    string s2;//="123876507";
    cout<<"num1:";
    cin>>s1;
    cout<<"num2:";
    cin>>s2;
    string n1=s1,n2=s2;
    if(s1.size()<s2.size())
    {
        n1=s2;
        n2=s1;
    }
    int i1=n1.size()-1;
    int i2=n2.size()-1;
    int n=0;
    for(;i2>=0 || i1>=0 && n; i2--,i1--)
    {
        n+=n1[i1]-'0';
        if(i2>=0) n+=n2[i2]-'0';
        n1[i1]=n%10+'0';
        n/=10;
    }
    if(n) n1=char(48+n)+n1;
    cout<<n1<<endl;
0
0 / 0 / 0
Регистрация: 26.03.2017
Сообщений: 32
18.08.2018, 13:59  [ТС] 7
Цитата Сообщение от Байт Посмотреть сообщение
Ruprecht Kraus, таки символы. И оперируете их КОДАМИ. Код символа '0' есть 48. И так далее.
'0' + '1' = 48 + 49 = 9710 = 6116 - это код символа 'a'
Я уже делал через - '0' и т.д. Не выходило все равно. Думаю просто вычитать из кода символа -48 буду чтобы в итоге получить нужное число. Да в том дело что я записывал с помощью cin сразу в массив. Все равно он складывает их коды. Вероятно потому что тип данных там unsigned char
0
Диссидент
Эксперт C
26354 / 16360 / 3558
Регистрация: 24.12.2010
Сообщений: 36,228
19.08.2018, 09:49 8
Цитата Сообщение от Ruprecht Kraus Посмотреть сообщение
Вероятно потому что тип данных там unsigned char
Не думаю, что дело в этом. Для первой половины (0-127) char и unsigned char совпадают. А коды цифр лежат как раз в этом диапазоне.
Цитата Сообщение от Ruprecht Kraus Посмотреть сообщение
Все равно он складывает их коды
Я думаю, что вы где-то неаккуратно приводите char к int и наоборот. Имхо, лучше сразу после ввода приводить к int, с ними производить все вычисления, а обратно к char приводить только уже при выводе.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.08.2018, 09:49

Сложить два пятидесятизначных десятичных числа.
Пожалуйсто помогите решить задачу: Сложить два пятидесятизначных десятичных числа.

Сложить столбиком два числа char
как сложить столбиком 2 числа записанных в char? Объясните кодом

Сложить два пятидесятизначных десятичных числа
Сложить два пятидесятизначных десятичных числа.Плиз помогите решеть,только в С,не в С++

Сложить два числа, записанные в файле
нужно создать программу которая будет находить сумму чисел, а числа в файле, разделенные пробелами...


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

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

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