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

Длинная арифметика. Задача А + В

29.10.2011, 17:48. Показов 8046. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Прошу помочь решить эту задачку, желательно с закомментированными построчными объяснениями. Особенно про подключаемые файлы -инпут и аутпут. Также желательно предельно простое решение (без всяких там классов, функций и проч., онли циклы и массивы). Заранее спасибо.

Требуется:
сложить два целых числа А и В.

Входные данные:
Во входном файле INPUT.TXT записано два неотрицательных целых числа, не превышающих 10100, по одному в каждой строке.

Выходные данные:
В единственную строку выходного файла OUTPUT.TXT нужно вывести одно целое число — сумму чисел А и В, без лидирующих нулей.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.10.2011, 17:48
Ответы с готовыми решениями:

Задача Новый год и старые свойства длинная арифметика
Здраствуйте помогите пожалуйста с задачой! Вроде бы длинная арифметика! Нужно решить ее срочно!...

длинная арифметика
Долгое время бьюсь как составить программу по этой теме в интернете искал нашел это for (int...

Длинная арифметика
:senor: Здраствуйте, пишу модуль длинной математики. В принципе, работоспособность у него...

Длинная арифметика
Здравствуйте, вопрос по поводу задачки, хочу попытаться реализовать решение на плюсах, а не на...

17
Студент
148 / 148 / 64
Регистрация: 18.01.2011
Сообщений: 469
29.10.2011, 18:40 2
на каком языке?
0
0 / 0 / 0
Регистрация: 29.10.2011
Сообщений: 9
29.10.2011, 20:14  [ТС] 3
C++ ,если можно
0
Студент
148 / 148 / 64
Регистрация: 18.01.2011
Сообщений: 469
29.10.2011, 23:57 4
ну вот так, через некоторое время, здесь напишут код по короче)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <fstream>
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"rus");
    ofstream out("OUTPUT.txt");
    ifstream in("INPUT.txt");
    int a, b;
    char ch[80];
    in >> a >> b;
    if (a > 10100 || a < 0 || b > 10100 || b < 0)
    {
        strcpy(ch,"Неправильные значения!");
        out << ch;
    }
    else
    {
        int s = a + b;
        out << "Сумма двух чисел = " << s;
    }
}
1
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
30.10.2011, 00:12 5
А при чем здесь ДЛИННАЯ АРИФМЕТИКА, хоть убей - не пойму.

Добавлено через 1 минуту
Для 10100 даже short подойдет
0
542 / 447 / 162
Регистрация: 10.12.2009
Сообщений: 1,857
30.10.2011, 00:50 6
Возможно,
Цитата Сообщение от AlexMind Посмотреть сообщение
10100
- это максимальная длина строки!
Хотя, мне тоже кажется, что это не так ( видно из условия задачи ).
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
30.10.2011, 01:13 7
Цитата Сообщение от Mиxaил Посмотреть сообщение
Возможно, - это максимальная длина строки!
Хотя, мне тоже кажется, что это не так ( видно из условия задачи ).
Скорее всего именно так! Тогда - поиск по форуму и Гугл в помощь!
Длинные числа - это самая простая из сложных задач. Решать ее - просто удовольствие.
Так не будем же отнимать этого удовольствия у ТС.
0
34 / 34 / 14
Регистрация: 06.05.2011
Сообщений: 91
30.10.2011, 01:15 8
Очевидно имелось в виду: "два неотрицательных целых числа, не превышающих 10^100", тогда как раз длинная арифметика только поможет.
1
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
30.10.2011, 03:26 9
Цитата Сообщение от ruslan_abel Посмотреть сообщение
Очевидно имелось в виду: "два неотрицательных целых числа, не превышающих 10^100", тогда как раз длинная арифметика только поможет.
А вы просто - экстрасенс!
0
0 / 0 / 0
Регистрация: 29.10.2011
Сообщений: 9
30.10.2011, 10:42  [ТС] 10
Пардон, не заметил - 10^100

Добавлено через 21 минуту
и вопрос - если у нас есть массив максимального размера 10^100 , а я ввожу число, меньшее этого размера - то что делать с остальным пространством? заполнять нулями? или что? и как это делается?

вот кусочек того что мозг родил:

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
#include <fstream>
#include <iostream>
using namespace std;
int main ()
{
ifstream f("input.txt"); 
ofstream h("output.txt");
 
const int MAX_SIZE=101;
 
int a[MAX_SIZE];
int b[MAX_SIZE];
 
cout << "Enter A " << endl;
for (int i=0; i<MAX_SIZE; i++)
{
    f >> a[i];
}
 
cout << "Enter B " << endl;
for (int i=0; i <MAX_SIZE; i++)
{
    f >> b[i];
}
Добавлено через 2 минуты
но в этом варианте заполнения массива - придется его весь заполнять - а именно - 101 цифра.
0
Студент
148 / 148 / 64
Регистрация: 18.01.2011
Сообщений: 469
30.10.2011, 11:07 11
так у вас написано два числа, зачем делать массивы
0
0 / 0 / 0
Регистрация: 29.10.2011
Сообщений: 9
30.10.2011, 11:12  [ТС] 12
так даны два числа размером с количеством цифр 101 в каждом . и сама тема - длинная арифметика. подсказали что решается с двумя массивами, притом складываются каждый i-ый элемент, при необходимости с переводом разряда в i+1 -ый элемент. притом складывается все это в третий массив. и записывается в аутпут.тхт. в теории - как это делать - мне ясно,но сама реализация в коде - чтото не выходит
0
return (true);
1976 / 1111 / 221
Регистрация: 19.04.2011
Сообщений: 2,345
30.10.2011, 11:16 13
Сложение больших чисел
0
0 / 0 / 0
Регистрация: 29.10.2011
Сообщений: 9
30.10.2011, 21:05  [ТС] 14
благодарю)

Добавлено через 9 часов 47 минут
решил таки сам добить эту задачку. и на первом же тесте - wrong answer. понять не могу-что не так. эксперты,подскажите ?

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
#include <fstream>
#include <iostream>
using namespace std;
int main ()
{
setlocale(0, "");
ifstream inp("input.txt"); 
ofstream out("output.txt");
 
const int MAX_SIZE=102;
int carry=0,i=0;
 
int A[MAX_SIZE];
int B[MAX_SIZE];
int C[MAX_SIZE];
 
//обнуляем массив C
for (int i=0; i<MAX_SIZE-1; i++)
{
    C[i]=0;
}
 
 
//Ввод массива А в файл
for (int i=0; i<=MAX_SIZE-1; i++)
{
    inp >> A[i];
}
 
//Ввод массива В файл
for (int i=0; i<=MAX_SIZE-1; i++)
{
    inp >> B[i];
}
 
//складываем 2 массива
for(i=0;i<=MAX_SIZE-1;i++)
{
carry=carry+A[i]+B[i];
C[i]=carry%10;
carry=carry/10;
}
 
//печать массива С в файл
for(i=0;C[i]!=0;i++)
{
    out << C[i];
}
 
return 0;
}
0
448 / 211 / 21
Регистрация: 07.10.2011
Сообщений: 462
30.10.2011, 21:19 15
AlexMind, как мне кажется, вы неверно читаете числа в массивы из файла. Предполагаю, что формат входного файла - что-то типа такого (цифры в числе записаны слитно, а не разделены пробелами)
123
12
Вы же пытаетесь их считывать в массив именно посимвольно, надеясь получить A[0]=1, A[1]=2, A[3]=3. А у вас оказывается A[0]=123. Соответственно и результат сложения будет не тот
Кроме того, представьте, что файл содержит два числа, длина которых меньше, чем MAX_SIZE.
Тогда в своем цикле вы в конец массива пишете непонятно что
Попробуйте сделать массивы символьными
0
0 / 0 / 0
Регистрация: 29.10.2011
Сообщений: 9
30.10.2011, 21:48  [ТС] 16
а разве незадействованные ячейки массива не инициализируются нулями автоматически?

или на всякий пожарный лучше просто массивы А и В обнулить заранее, а далее при вводе элементов нули будут просто затираться вводимыми значениями. так?

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

ааааа...я уже запутался....

Цитата Сообщение от aeshes Посмотреть сообщение
как мне кажется, вы неверно читаете числа в массивы из файла.
насколько я понимаю-это число как бы одновременно вводится и в инпут.тхт и в каждый элемент массива. нет?
0
448 / 211 / 21
Регистрация: 07.10.2011
Сообщений: 462
30.10.2011, 21:58 17
AlexMind, нет, число не вводится в инпут.тхт и массив одновременно.
У тебя есть заранее созданный файл input.txt, лежащий в папочке с программой, в который записаны 2 числа, например,
123
45
Эти числа из файла должны читаться в массив. Но при такой записи inp>>A[i]; ты читаешь число целиком (123) и записываешь его в одну ячейку массива, а не по отдельным цифрам.

Незадействованные ячейки массива нулями автоматически не заполняются. И тебе не поможет обнуление массивов заранее, потому что тогда у тебя условно получатся числа 123000 и 450000.
И их сумма будет вычислена неверно.

Мои предложения: вместо массивов int используй массивы char. Они как раз позволят тебе считанное из файла число расписать посимвольно (по одной цифре в ячейку массива). Затем к более короткому числу нужно дописать впереди нули (например, из чисел 123 и 45 надо получить 123 и 045), и складывать их посимвольно с конца, а не сначала, как ты делаешь это сейчас.
0
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 6
05.04.2014, 04:18 18
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
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("input.txt");
ofstream out("output.txt");
*
*
int main()
{ string a,b;
in>>a>>b;
int max1;
vector<int> x;
vector<int> y;
vector<int> s;
if (a.size()>b.size())
****max1 = a.size();
else
****max1= b.size();
x.resize(max1+1);
y.resize(max1+1);
s.resize(max1+1);
for (int j=0,i=x.size()-1; j<a.size()&& i>0; j++,i--)
x[i]= a[a.size()-j-1]- '0';
*
for (int j=0,i=y.size()-1;j<b.size()&& i>0; j++,i--)
y[i]= b[b.size()-j-1]- '0';
*
for (int i=x.size()-1;i>=0; i--) {
********s[i]=x[i]+y[i];
********if (s[i]>9) {
************s[i]%=10;
************x[i-1]+=1;
********}
*
*
}
*
**if (s[0]==0)
**for (int i=1; i<s.size(); i++)
*****out << s[i];
*******else
*******for (int i=0; i<s.size(); i++)
*out <<s[i];
*
*
****return 0;
}
0
05.04.2014, 04:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.04.2014, 04:18
Помогаю со студенческими работами здесь

Длинная арифметика
Ребята,объясните как решить задачу , напишите хоть часть кода. Пусть даны числа a , b . Найти...

Длинная арифметика
Как сделать типы длинных чисел, например, знаковое 256-ти битное целое и 256-ти битное вещественное...

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

Длинная арифметика
Вот условие задачи: Во время исследований, посвященных появлению жизни на планете Олимпия, учеными...


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

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