Форум программистов, компьютерный форум CyberForum.ru

Сумма двух чисел - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
as
36 / 22 / 3
Регистрация: 14.02.2009
Сообщений: 355
07.04.2010, 23:36     Сумма двух чисел #1
Всем привет!
Есть два числа X и Y, проблема в том что они очень большие и не подходят ни к одному типу...
Суммировать их надо в столбик.

В чем хранить такие большие числа???(может в строках)?

Добавлено через 2 часа 41 минуту
использовал строки:
C++
1
2
3
4
5
6
7
8
 freopen("out.txt", "rt", stdin);
 string x;
for (int i=0; i<5; i++)
{
    cin>>x;
 
cout<<" "<<x;
}
Во входном файле записаны числа:
10000000000 999999999
7
234 8966563217

А на вывод выводит:
10000000000 999999999 7 234 8966563217

КАК ОТСЛЕДИТЬ ПЕРЕХОД СТРОКИ ИЛИ КАК ПОСТРОЧНО СЧИТЫВАТЬ, ПОДСКАЖИТЕ ПОЖАЛУЙСТА!!!!


Добавлено через 1 минуту
(чтобы на экран выводилось так же как в файле записано)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
07.04.2010, 23:36     Сумма двух чисел #2
Хранить большие числа лучше в массивах, типа
C
1
 unsigned long X[100], Y[100], Z[100];
А дальше в столбик, как в 1-м классе, только разряды очень большие.
И за переполнениями следить.
Подсказка.
C
1
2
3
4
5
  unsigned long a, b, c;
   c = a + b;
   if (c < a) {
      // переполнение: +1 - в уме
   }
Vorona
07.04.2010, 23:41
  #3

Не по теме:

да в массив их и с каждым числом работать, начиная с последнего элемента массива, как с цифрой младшего порядка, к примеру если элемент массива при каком-то действии(сложении) в результате больше 10, то разбиваем его на 2 цифры(тоже можно использовать массив: временный) и последнюю оставляем, а первую прибавляем к более старшему по порядку элементу числа, после чего обнуляем временный массив для того чтобы при повторной процедуре не было недоразумений)

ээ, опоздал)

as
36 / 22 / 3
Регистрация: 14.02.2009
Сообщений: 355
07.04.2010, 23:55  [ТС]     Сумма двух чисел #4
Есть один небольшой нЮанс)
Я не знаю заранее сколько будет чисел и какого они размера.
Я писал в начале темы: "числа могут быть ОЧЕНЬ БОЛЬШИМИ !!!"

например 99999999999 оно не влезет в unsigned long

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

Может кто знает как это сделать или может другой какой-нибудь способ решить эту задачу???
EvilSlipp3r
32 / 32 / 3
Регистрация: 25.03.2010
Сообщений: 45
08.04.2010, 00:06     Сумма двух чисел #5
Выложил как пример.
Файл number1.txt - Каждое число в своей строке.
Складывает только положительные целые числа. Число в векторе хранится в обратном порядке.
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
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <stdlib.h>
 
using namespace std;
 
// суммирование
vector<int> summ(vector<int>& num1, vector<int>& num2)
{
        int maxlen = num1.size() > num2.size() ? num1.size() : num2.size();
        vector<int> result ; // вектор для результата сложения
 
        int digit1, digit2, rest = 0, summ;
        for (int i = 0; i < maxlen; i++) {
                digit1 = i < static_cast<int>(num1.size()) ? num1[i] : 0;
                digit2 = i < static_cast<int>(num2.size()) ? num2[i] : 0;
                summ = rest + digit1 + digit2;
                result.push_back(summ % 10);
                rest = summ / 10;
        }
        if (rest)
                result.push_back(rest);
        return result;
}
 
// запись числа в вектор
vector<int> readNumber(istream &is) {
        string strNum;
        is >> strNum;
        vector<int> vecNum;
        char digit;
 
        for (int i = static_cast<int>(strNum.length()) - 1; i >= 0 ; i-- ) {
                digit = *strNum.substr(i,1).c_str();
                if (!isdigit(digit))
                        return vecNum;
                vecNum.push_back(static_cast<int>(digit - '0'));
        }
        return vecNum;
}
 
// печать
void printNumber(vector<int>& vecNum) {
        vector<int>::reverse_iterator number;
        for(number = vecNum.rbegin(); number != vecNum.rend(); ++number ) {
                cout << *number ;
        }
        cout << endl ;
}
 
 
 
int main(){
 
        vector<int> number1, number2; 
 
        ifstream fin("number1.txt"); 
        if (!fin) {
                cerr << "*** input file not found." << endl;
                return 1;
        }
 
        number1 = readNumber(fin);
        number2 = readNumber(fin);
 
        cout << "First digit: " ;
        printNumber(number1);
        cout << "Second digit: " ;
        printNumber(number2);
 
        cout << "===== \n";
        
        // сложение
        vector<int> number3 = summ(number1,number2);
 
        cout << "Final summ = " ;
        printNumber(number3);
 
        return 0;
}
as
36 / 22 / 3
Регистрация: 14.02.2009
Сообщений: 355
08.04.2010, 00:18  [ТС]     Сумма двух чисел #6
Спасибо за алгоритм все работает, НО ПРОБЛЕМА ОСТАЛАСЬ.
Он считывает первые два числа, а в файле может быть четыре числа или четыреста чисел.

Вопрос:
Как считать построчно все числа в файле???
EvilSlipp3r
32 / 32 / 3
Регистрация: 25.03.2010
Сообщений: 45
08.04.2010, 00:25     Сумма двух чисел #7
Сам не проверял. Видимо через цикл while.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <fstream>
#include <vector>
#include <string>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
   vector<string> Data;
   ifstream ifs;
   string buf;
 
   ifs.open("somefile.txt");
   if(!ifs) return -1;
   while(ifs)
   {
      getline(ifs,buf);
      if(""==buf)break;
      Data.push_back(buf);
   }
   return 0;
}
Хотя наверно лучше через
C++
1
while(!ifs.eof())
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2010, 00:31     Сумма двух чисел
Еще ссылки по теме:

Если сумма двух чисел меньше 1, то большее из чисел заменить их произведением C++
Сумма, произведение, разность, и частное от деления двух чисел C++
C++ Сумма двух различных действительных чисел

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

Или воспользуйтесь поиском по форуму:
as
36 / 22 / 3
Регистрация: 14.02.2009
Сообщений: 355
08.04.2010, 00:31  [ТС]     Сумма двух чисел #8
обьясните пожалуйста значение этих сток, а то я что-то не могу понять...
C++
1
2
if(""==buf)break;
      Data.push_back(buf);
Yandex
Объявления
08.04.2010, 00:31     Сумма двух чисел
Ответ Создать тему
Опции темы

Текущее время: 08:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru