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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 43, средняя оценка - 4.60
WiDe
10 / 10 / 1
Регистрация: 23.02.2010
Сообщений: 120
25.03.2010, 18:23     Сложение двух чисел #1
Сложение двух чисел. Как, если оба числа в диапазоне от 0 до 2*10^9 ? Если складывать 2*10^9 + 2*10^9 то long int не справляется((
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.03.2010, 18:23     Сложение двух чисел
Посмотрите здесь:

сложение двух чисел в С C++
C++ Сложение двух больших чисел
Сложение двух длинных чисел. C++
C++ Измерить время выполнения (сложение двух чисел)
C++ Сложение двух чисел
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
UKOL
 Аватар для UKOL
112 / 64 / 7
Регистрация: 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);
WiDe
10 / 10 / 1
Регистрация: 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
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
25.03.2010, 19:10     Сложение двух чисел #4
WiDe, потому что прототип принимает int (void WriteFile(int a)), а реализация double (void WriteFile(double s)).
WiDe
10 / 10 / 1
Регистрация: 23.02.2010
Сообщений: 120
25.03.2010, 19:42  [ТС]     Сложение двух чисел #5
Блин, не заметил=) Но всё равно не сработало. После сложения прога вывела -2.94967e+08

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

Добавлено через 3 минуты
Кстати, а данную программу реально переделать так, чтобы чтение файла вынести в обдельную функцию? При условии, что входной файл имеет вид:
Код
5 8
32 68
436 54
а выходной суммы этих чисел на каждой строке соответственно. Я смог сделать (код выше) только если функция чтения в мейне, а записи и нахождения суммы в отдельных...
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
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 секунды
Я думаю, этого с лихвой хватит
KIRASIR
5 / 5 / 0
Регистрация: 24.03.2010
Сообщений: 26
25.03.2010, 20:06     Сложение двух чисел #7
а если попробовать число разбить на: десятки, сотни, тысячи и т.д.
а затем складывать отдельно десятки, сотни и т.д.
после всего все полученные суммы по-разрядно внести в массив и вывод на экран.
поправьте если не прав.
WiDe
10 / 10 / 1
Регистрация: 23.02.2010
Сообщений: 120
25.03.2010, 21:45  [ТС]     Сложение двух чисел #8
Nameless One, ну про такой вариант я тоже думал... И мне кажется что по другому тут не сделаешь... В main получится только вызов ReadFile(); и всё=) Всё-равно спасибо!

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

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


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


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

C++ Сложение двух чисел в С++
C++ Сложение столбиков двух массивов чисел
Сложение двух чисел на TurboC++ C++

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

Или воспользуйтесь поиском по форуму:
breate
 Аватар для breate
56 / 56 / 2
Регистрация: 23.10.2009
Сообщений: 250
29.03.2010, 01:14     Сложение двух чисел #18
плохо тогда просто проконтролировать переполнение легче

Добавлено через 3 минуты
тогда лучше всего тебе с char * работать выдели кусок памяти достаточный для 2*10^10 и аккуратненько запиши пошаговое сложение
Yandex
Объявления
29.03.2010, 01:14     Сложение двух чисел
Ответ Создать тему
Опции темы

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