Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 43, средняя оценка - 4.60
WiDe
10 / 10 / 2
Регистрация: 23.02.2010
Сообщений: 120
#1

Сложение двух чисел - C++

25.03.2010, 18:23. Просмотров 6245. Ответов 17
Метки нет (Все метки)

Сложение двух чисел. Как, если оба числа в диапазоне от 0 до 2*10^9 ? Если складывать 2*10^9 + 2*10^9 то long int не справляется((
http://www.cyberforum.ru/cpp-beginners/thread1933352.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.03.2010, 18:23
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Сложение двух чисел (C++):

Сложение двух чисел
P.S Код должен выполнять аналогию сложения двух числе в столбик. Добавлено...

Сложение двух чисел
Условие задачи в её названии. Я так понимаю тут длинная арифметика. Во...

Сложение двух чисел
Подскажите где ошибка. Спасибо. #include "stdafx.h" #include "iostream"...

Сложение двух чисел
Написать программу сложения двух чисел на Visual c++. Вот мой код. #include...

Сложение двух больших чисел
#include <vector> #include <fstream> #include <string> using namespace std;...

17
UKOL
112 / 64 / 14
Регистрация: 17.11.2009
Сообщений: 258
25.03.2010, 18:33 #2
попробуй тип, unsigned long 4 байта 32 бита диапазон от 0 до 4294967295 должно влезть

или уж double, float

C++
1
2
3
4
int a;
int b;
double c;
c=(double)(a+b);
1
WiDe
10 / 10 / 2
Регистрация: 23.02.2010
Сообщений: 120
25.03.2010, 19:04  [ТС] #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
35
36
37
38
39
40
41
42
43
//---------------------------------------------------------------------------
#include <vcl.h>
#include <fstream.h>
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
//---------------------------------------------------------------------------
void WriteFile(int a);//ÔóГ*êöèÿ Г§Г*ГЇГЁГ±ГЁ Гў ГґГ*éë
double Summ(int a, int b); //ÔóГ*êöèÿ Г*Г*õîæäåГ*ГЁГї ñóììû äâóõ Г·ГЁГ±ГҐГ«
 
int main()
{
        int a, b;
        double s;
 
        ifstream instream("input.txt");
        if (!instream) {
                cout<<"Г”Г*éë Г*ГҐ îòêðûëñÿ"<<endl;
                getch();
                return 0; }
        while(!instream.eof()) {
                instream>>a>>b;
                s=Summ(a, b);
                WriteFile(s); }
        instream.close();
        getch();
        return 0;
}
 
 
void WriteFile(double s)
{
ofstream outstream("output.txt", ios::app);
outstream<<s<<endl;
outstream.close();
}
 
double Summ(int a, int b)
{       double s;
 
        s=(double)(a+b);
        return s;
}
Почему ругается на код? Вот ошибка:
Код
[Linker Error] Unresolved external 'WriteFile(int)' referenced from D:\ÐÀÁÎÒÀ (WORK)\ÊÎÍÊÓÐÑ\UNIT1.OBJ
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
25.03.2010, 19:10 #4
WiDe, потому что прототип принимает int (void WriteFile(int a)), а реализация double (void WriteFile(double s)).
1
WiDe
10 / 10 / 2
Регистрация: 23.02.2010
Сообщений: 120
25.03.2010, 19:42  [ТС] #5
Блин, не заметил=) Но всё равно не сработало. После сложения прога вывела -2.94967e+08

Добавлено через 1 минуту
Всё, заработало, сделал через unsigned long. Спасибо!

Добавлено через 3 минуты
Кстати, а данную программу реально переделать так, чтобы чтение файла вынести в обдельную функцию? При условии, что входной файл имеет вид:
Код
5 8
32 68
436 54
а выходной суммы этих чисел на каждой строке соответственно. Я смог сделать (код выше) только если функция чтения в мейне, а записи и нахождения суммы в отдельных...
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
25.03.2010, 19:57 #6
Попробуй
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void ReadFile()
{
    int a, b;
        double s;
 
        ifstream instream("input.txt");
        if (!instream) {
                cout<<"Файл не открылся"<<endl;
                getch();
                exit(1); }
        while(!instream.eof()) {
                instream>>a>>b;
                s=Summ(a, b);
                WriteFile(s); }
        instream.close();
}
Добавлено через 1 минуту
ЗЫ. Можно попробовать вместо double использовать целый тип long long. На моей машине максимальное значение, которое помещается в этот тип, равно 9223372036854775807

Добавлено через 24 секунды
Я думаю, этого с лихвой хватит
1
KIRASIR
5 / 5 / 1
Регистрация: 24.03.2010
Сообщений: 26
25.03.2010, 20:06 #7
а если попробовать число разбить на: десятки, сотни, тысячи и т.д.
а затем складывать отдельно десятки, сотни и т.д.
после всего все полученные суммы по-разрядно внести в массив и вывод на экран.
поправьте если не прав.
0
WiDe
10 / 10 / 2
Регистрация: 23.02.2010
Сообщений: 120
25.03.2010, 21:45  [ТС] #8
Nameless One, ну про такой вариант я тоже думал... И мне кажется что по другому тут не сделаешь... В main получится только вызов ReadFile(); и всё=) Всё-равно спасибо!

KIRASIR, можно и так, но это намного сложнее реализуемо.
0
KIRASIR
5 / 5 / 1
Регистрация: 24.03.2010
Сообщений: 26
25.03.2010, 22:14 #9
такие задачи на олимпиадах по программированию даются.
Сложить два числа на скорость. Каждое из которых имеет по 32 цифры. Разрядность шины 16.

вот тогда и приходится разбивать число на несколько составляющих. И кстати, хз почему но было подмечено что если число делить на две составляющие то система нагружается меньше, а если разбивать на 3 составляющие то увеличивается прирост к производительности проги на 30%(или наоборот). В таком стиле обычно военных учат программировать.
0
WiDe
10 / 10 / 2
Регистрация: 23.02.2010
Сообщений: 120
25.03.2010, 23:25  [ТС] #10
Просто я думаю вряд ли в таком задании будет приветствоваться использование массива...
0
breate
56 / 56 / 6
Регистрация: 23.10.2009
Сообщений: 250
26.03.2010, 01:53 #11
Вообще должен прокатить unsigned long long или long double (на некоторых машинах),


Цитата Сообщение от WiDe Посмотреть сообщение
Просто я думаю вряд ли в таком задании будет приветствоваться использование массива...


я с тобой не согласен да действительно на олимпиадах даются такие задания в прошлом году в четвертьфинале была задаса на длинную арифметику было число размеров в 100 000 знаков до "." и 100 000 после точки и эти два числа нужно было сравнить и все это сделать за секунду.... могло оно записывается как 000001616846684.168461510000000 единственный нормальный вариант это массив из char* , я думаю операции с длинной арифметикой будут приветствовать все преподаватели. тем более тут еще контроль переходящей в старший разряд 1-цей. кстати очень полезно будет если ты напишешь умножение таких чисел.
0
WiDe
10 / 10 / 2
Регистрация: 23.02.2010
Сообщений: 120
26.03.2010, 16:57  [ТС] #12
Надо попробовать подобный вариант...
0
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
26.03.2010, 16:59 #13
Цитата Сообщение от breate Посмотреть сообщение
единственный нормальный вариант это массив из char*
Это как раз ненормальный вариант, лучше всего использовать массивы из типов, разрядность который соответсвует разрядности ОС, чтобы производительность была максимальной
0
breate
56 / 56 / 6
Регистрация: 23.10.2009
Сообщений: 250
26.03.2010, 17:17 #14
Цитата Сообщение от fasked Посмотреть сообщение
Это как раз ненормальный вариант, лучше всего использовать массивы из типов, разрядность который соответсвует разрядности ОС, чтобы производительность была максимальной
код в студию! уловие: в файле лежат 2 числа типа
Код
00000000000000000051680046156846.546165188598000
00000000000000000000000000000000000000000000051680046156846.546165188598001
ограничение на числа [100 000][.][100 000] сравнить их. время выполнения 1 сек@1.2GHZ
32-бита ось
0
WiDe
10 / 10 / 2
Регистрация: 23.02.2010
Сообщений: 120
28.03.2010, 20:37  [ТС] #15
Блин, я тут заметил, что unsigned long не складывает отрицательные числа... long long тоже. Другие же варианты, о которых говорили, складывают, но там нельзя сложить большие числа (вместо 2000000000 выводит -2.94967e+08
0
breate
56 / 56 / 6
Регистрация: 23.10.2009
Сообщений: 250
28.03.2010, 21:44 #16
Цитата Сообщение от WiDe Посмотреть сообщение
вместо 2000000000 выводит -2.94967e+08
тогда только char* или int* ты на ASM`е прогать умеешь?
0
WiDe
10 / 10 / 2
Регистрация: 23.02.2010
Сообщений: 120
28.03.2010, 22:06  [ТС] #17
неа...
0
breate
56 / 56 / 6
Регистрация: 23.10.2009
Сообщений: 250
29.03.2010, 01:14 #18
плохо тогда просто проконтролировать переполнение легче

Добавлено через 3 минуты
тогда лучше всего тебе с char * работать выдели кусок памяти достаточный для 2*10^10 и аккуратненько запиши пошаговое сложение
0
29.03.2010, 01:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2010, 01:14
Привет! Вот еще темы с решениями:

Рекурсия: сложение двух чисел
Написать рекурсивную программу сложения двух чисел........ помогите срочно...

Сложение двух длинных чисел.
всем привет. как вы считаете, каким способом лучше сделать? или абсолютно...

Сложение двух чисел на TurboC++
Всем привет! Подскажите, в чем ошибка с переменной с? Вот скрины - Коды...

Сложение двух чисел (длинная арифметика)
Нужно реализовать длинную арифметику (сложение двух больших чисел), но на экран...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru