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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.65
Zverit
Уничтожитель печенек
 Аватар для Zverit
276 / 204 / 21
Регистрация: 07.02.2010
Сообщений: 723
05.10.2011, 16:04     Сложение двух больших чисел #1
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
#include <vector>
#include <fstream>
#include <string>
using namespace std;
 
int main()
{
 
const int base = 1000 * 1000 * 1000;   
vector <int> n;
vector <int> a;
 
string s,m;
 
ifstream fin ("INPUT.TXT");
ofstream fout ("OUTPUT.TXT");
 
fin>>s>>m;
 
for (int i=(int)s.length(); i>0; i-=9)
    if (i < 9)
        a.push_back (atoi (s.substr (0, i).c_str()));
    else
        a.push_back (atoi (s.substr (i-9, 9).c_str()));
        
 
for (int i=(int)m.length(); i>0; i-=9)
    if (i < 9)
        n.push_back (atoi (m.substr (0, i).c_str()));
    else
        n.push_back (atoi (m.substr (i-9, 9).c_str()));
        
 
int count = 0;
 
for (size_t i = 0; i < max(n.size(), a.size())||count; ++i){
   if (i == n.size()) 
      n.push_back(0);
    n[i] += count + (i < a.size() ? a[i] : 0);
    count  = n[i] >= base;
    if (count) a[i] -= base;
}
 fout<<(n.empty() ? 0 : n.back());
for (int i = (int) n.size() - 2; i >= 0; i--)
fout<<n[i];
 
    return 0;
}
Подскажите в чем ошибка? Вроде все правильно, но не проходит 4 тест на ********
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.10.2011, 16:04     Сложение двух больших чисел
Посмотрите здесь:

C++ Сложение двух чисел
Сложение больших чисел C++
сложение двух чисел в С C++
нужна помощь. Сложение и вычитание больших чисел. C++
C++ Сложение двух чисел
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
05.10.2011, 16:18     Сложение двух больших чисел #2
На тест
1000000000
1

У вас выходит 11.
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
05.10.2011, 16:49     Сложение двух больших чисел #3
Почему бы не воспользоваться готовыми библиотеками для работы с большими числами благо их полно.
Zverit
Уничтожитель печенек
 Аватар для Zverit
276 / 204 / 21
Регистрация: 07.02.2010
Сообщений: 723
05.10.2011, 18:02  [ТС]     Сложение двух больших чисел #4
gooseim, Да с удовольствием! Только, на олимпиаде , боюсь, не разрешат.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
05.10.2011, 19:01     Сложение двух больших чисел #5
Цитата Сообщение от gooseim Посмотреть сообщение
Почему бы не воспользоваться готовыми библиотеками для работы с большими числами благо их полно.
Вряд ли на олимпиаде будут компиляторы с установленным бустом/gmp/etc =)
Зато возможно будет такое(все решение в 26-28 строках)
Java
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
import java.io.*;
 
import java.math.BigInteger;
import java.util.Scanner;
 
public class Main
{
    public static void main( String[] args ) throws IOException
    {
        new Main().run();
    }    
    
    Scanner in;
    PrintWriter out;
    
    void run() throws IOException
    {
        in = new Scanner ( System.in );
        out = new PrintWriter ( System.out );
        solve();
        out.flush();
    }
    
    void solve() throws IOException
    {
        BigInteger a = in.nextBigInteger();
        BigInteger b = in.nextBigInteger();
        out.println( a.add(b) );
    }
    
}
Zverit
Уничтожитель печенек
 Аватар для Zverit
276 / 204 / 21
Регистрация: 07.02.2010
Сообщений: 723
05.10.2011, 19:11  [ТС]     Сложение двух больших чисел #6
diagon, в Java не силен. Времени на изучение нет. Не такая уж и сложная эта арифметика. Да и для понятия алгоритмов пригодится.
KeyGen
 Аватар для KeyGen
333 / 289 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
06.10.2011, 01:25     Сложение двух больших чисел #7

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
83
84
85
86
87
88
89
90
91
92
93
#include <iostream>
using namespace std;
    
int charvint(char * mass, int *mass);
 
int main()
{
    setlocale(LC_ALL, "rus");
    
    cout << "Ââåäèòå ïåðâîå ÷èñëî: ";
    
    int l1;
    char massc[20]={};
    int massi[20]={};
    cin.get(massc,20);
    l1=charvint(massc,massi);
    cin.get();
    
    cout << "Ââåäèòå âòîðîå ÷èñëî: ";
    
    int l2;
    char massc1[20]={};
    int massi1[20]={};
    cin.get(massc1,20);
    l2=charvint(massc1,massi1);
    cin.get();
 /////////////////////////////////////////////   
    int schet=0;
    int kk;
    if(l2<l1){
    kk=l1;
    
    for (int i=0; i<kk; i++)
    if (massi1[i]!=0)
    schet++;
    schet=kk-schet;
    
    for (int i=0; i<kk; i++)
    massi1[i+schet]=massi1[i];
    for (int i=0; i<schet; i++)
    massi1[i]=0;  
    }
    else if(l2>l1){
    kk=l2;
    
    for (int i=0; i<kk; i++)
    if (massi[i]!=0)
    schet++;
    schet=kk-schet;
    
    for (int i=0; i<kk; i++)
    massi[i+schet]=massi[i];
    for (int i=0; i<schet; i++)
    massi[i]=0;  
    }
    else
    kk=l2;
 
 ///////////////////////////////////////////// 
    cout << "Ââåäèòå Г§Г*Г*ГЄ + : ";
    
    int massiv[20]={};
    char plus;
    cin >> plus;
    if(plus=='+')
    for(int i=kk-1; i>=0; i--){
    massiv[i]+=massi[i]+massi1[i];
    if (massiv[i]>9){
    massiv[i]-=10;
    massiv[i-1]+=1;}
    }
    
    cout << "ГЋГІГўГҐГІ: ";
    
    for(int i=0; i<kk; i++)
    cout << massiv[i];
    
    
    
    
    cout << "\n\n\n";
    system("PAUSE");
    return 0;
}
//Ïåðåâîä ГЁГ§ Г¬Г*Г±Г±ГЁГўГ* char öèôðû Гў Г¬Г*Г±Г±ГЁГў int
int charvint(char * massc, int *massi){
     int l=0;
     for(int i=0; massc[i]!='\0'; i++,l++){
     massi[i]=int(massc[i]);
     massi[i]-=48;
     }
     return l;
}
Да вот только 99 и 99 уже не сложить, (198) 1-ка выходит за приделы куда-то)). Но это, в принципе, можно исправить.
Миниатюры
Сложение двух больших чисел  
KeyGen
 Аватар для KeyGen
333 / 289 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
06.10.2011, 19:55     Сложение двух больших чисел #8
Переписал. Все исправил. Все чудно работает. Размер цифр зависит только от размера массивов.
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <iostream>
using namespace std;
 
const int Size=41;
    
int charvint(char *, int *);
 
void Sum(char *,char *);
 
int main()
{
    setlocale(LC_ALL, "rus");
    
    cout << "Ââåäèòå ïåðâîå ÷èñëî: ";
    char massc[Size];
    cin.get(massc,Size);
    cin.get();
    
    cout << "Ââåäèòå âòîðîå ÷èñëî: ";
    char massc1[Size];
    cin.get(massc1,Size);
    cin.get();
    
    Sum(massc,massc1);
    
    
    cout << "\n\n\n";
    system("PAUSE");
    return 0;
}
//Ïåðåâîä ГЁГ§ Г¬Г*Г±Г±ГЁГўГ* char öèôðû Гў Г¬Г*Г±Г±ГЁГў int
int charvint(char * massc, int *massi){
     int l=0;
     for(int i=0; massc[i]!='\0'; i++,l++){
     massi[i]=int(massc[i]);
     massi[i]-=48;
     }
     return l;
}
 
//ÂûïîëГ*ГҐГ*ГЁГҐ ñëîæåГ*ГЁГї
void Sum(char *massc,char *massc1){
     
    int l1;
    int massi[Size];
    for (int i=0; i<Size; i++)
    massi[i]=22;
    
    l1=charvint(massc,massi);
    
    int l2;
    int massi1[Size];
    for (int i=0; i<Size; i++)
    massi1[i]=22;
    
    l2=charvint(massc1,massi1);
     
    int schet=0;
    int kk;
    if(l2<l1){
    kk=l1;
    
    for (int i=0; i<kk; i++)
    if (massi1[i]!=22)
    schet++;
    schet=kk-schet;
    
    for (int i=kk; i>=0; i--)
    massi1[i+schet]=massi1[i];
    for (int i=0; i<schet; i++)
    massi1[i]=0;  
    }
    else if(l2>l1){
    kk=l2;
    
    for (int i=0; i<kk; i++)
    if (massi[i]!=22)
    schet++;
    schet=kk-schet;
    
    for (int i=kk; i>=0; i--)
    massi[i+schet]=massi[i];
    for (int i=0; i<schet; i++)
    massi[i]=0;  
    }
    else
    kk=l2; 
 
 for (int i=kk; i>=0; i--){
    massi[i+1]=massi[i];
    massi1[i+1]=massi1[i];
}
    massi[0]=0;
    massi1[0]=0;
 
    
    int massiv[Size]={};
    
    
    for(int i=kk; i>0; i--){
    massiv[i]+=massi[i]+massi1[i];
    if (massiv[i]>9){
    massiv[i]-=10;
    massiv[i-1]+=1;}
    }
    
    cout << "               ГЋГІГўГҐГІ: ";
    if(massiv[0]==0)
    for(int i=1; i<=kk; i++)
    cout << massiv[i];
    else
    for(int i=0; i<=kk; i++)
    cout << massiv[i];
 
}
Миниатюры
Сложение двух больших чисел  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2011, 20:03     Сложение двух больших чисел
Еще ссылки по теме:

C++ Сложение двух чисел в С++
C++ Сложение больших чисел (длинная арифметика)
Сложение больших чисел C++

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

Или воспользуйтесь поиском по форуму:
KeyGen
 Аватар для KeyGen
333 / 289 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
06.10.2011, 20:03     Сложение двух больших чисел #9
Нашел ошибку... Потом как нибудь исправлю. После 23-х значное число не суммируется с меньшим числом. В остальном вроде порядок.
Yandex
Объявления
06.10.2011, 20:03     Сложение двух больших чисел
Ответ Создать тему
Опции темы

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