Форум программистов, компьютерный форум, киберфорум
Наши страницы
student203
Войти
Регистрация
Восстановить пароль
Оценить эту запись

сложение двух больших чисел через две строчки

Запись от student203 размещена 23.03.2018 в 14:09

Очень долго парился с таким вопросом , в общем решил написать сам . Суть алгоритма в том , что мы складываем непосредственно числа в строке и не приводим числа к типам данных(int,uint,long и тд) , в общем работаем с двумя строками и получается так , что мы можем складывать числа например : 10000000000000000+1021240000000000000000000012318409.
Сам код:
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
//это функция , на вход поступает массив (Arr[2]) где [0]- число 1 , [1] - операнд , [2] - число 2 
//так как эта функция не только на сложение , я не могу скинуть ее всю , еще не доделал ) Кому помог , отпишитесь)
if (operand == '+')
            {
                string s = arr[0];//число 1 
                string s1 = arr[2];//число 2
 
                int x = 0;//переменная (например 9 + 9 = 18 , а следоватеьно х = 1) то есть это разряд
                if (s.Length > s1.Length)
                {
                    int raz = s.Length - s1.Length;//высчитываем разницу в длинне
                    string answer = "";//строка - ответ
 
                    for (int i = s.Length - 1; i > -1; i--)
                    {
                        int x1;//например 9 + 9 = 18 , а следоватнль х1 = 8
                        if (i - raz > -1)//i - raz > -1 сделано для того , чтобы не вылетать по длинне второго числа , чтобы не было ошибок
                        {
                            x1 = Convert.ToInt32(s[i].ToString()) + Convert.ToInt32(s1[i - raz].ToString()) + x;//прибавляем например 9 + 9 + x ( где x  - это разряд )
                            if (x1 > 9)//if 9 + 9 > 9 , то к иксу добавляем 1 разрад (x++) , а в строку записываем остаток от деления на 10
                            {
                                x = x1 / 10;
                                x1 -= 10;
                            }
                            else
                                x = 0;//обнуляем разряд 
                            answer += x1.ToString();//в ответ записываем получившееся число
                        }
                        else//если по размеру второе число вылетает , то входим в этот цикл(второй число закончилось , работаем только с первым)
                        {
                            if (x > 0) //если разряд есть 
                            {
                                if (Convert.ToInt32(s[i].ToString()) + x >= 10)//если 
                                {
                                    x = (Convert.ToInt32(s[i].ToString()) + x) / 10;
                                    answer += (Convert.ToInt32(s[i].ToString()) + x) - 10;
                                }
                                else
                                {
                                    answer += Convert.ToInt32(s[i].ToString()) + x;
 
                                    x = 0;
                                }
                            }
                            else
                            {
                                if (Convert.ToInt32(s[i].ToString()) + x > 10)
                                {
                                    x = (Convert.ToInt32(s[i].ToString()) + x) / 10;
                                    answer += (Convert.ToInt32(s[i].ToString()) + x) - 10;
                                }
                                else
                                {
                                    answer += Convert.ToInt32(s[i].ToString()) + x;
 
 
                                }
                            }
 
                        }
 
 
                    }
                    if (x > 0)
                    {
                        answer += x;
                    }
                    answer = new string(answer.ToCharArray().Reverse().ToArray());
                    return answer;
                }
                else if (s.Length < s1.Length)
                {
                    int raz = s1.Length - s.Length;
                    string answer = "";
 
                    for (int i = s1.Length - 1; i > -1; i--)
                    {
                        int x1;
                        if (i - raz > -1)
                        {
                            x1 = Convert.ToInt32(s[i - raz].ToString()) + Convert.ToInt32(s1[i].ToString()) + x;
                            if (x1 > 9)
                            {
                                x = x1 / 10;
                                x1 -= 10;
                            }
                            else
                                x = 0;
                            answer += x1.ToString();
                        }
                        else
                        {
                            if (x > 0)
                            {
                                if (Convert.ToInt32(s1[i].ToString()) + x >= 10)
                                {
                                    x = (Convert.ToInt32(s1[i].ToString()) + x) / 10;
                                    answer += (Convert.ToInt32(s1[i].ToString()) + x) - 10;
                                }
                                else
                                {
                                    answer += Convert.ToInt32(s1[i].ToString()) + x;
 
                                    x = 0;
                                }
                            }
                            else
                            {
                                if (Convert.ToInt32(s1[i].ToString()) + x > 10)
                                {
                                    x = (Convert.ToInt32(s1[i].ToString()) + x) / 10;
                                    answer += (Convert.ToInt32(s1[i].ToString()) + x) - 10;
                                }
                                else
                                {
                                    answer += Convert.ToInt32(s1[i].ToString()) + x;
 
 
                                }
                            }
 
                        }
 
 
                    }
                    if (x > 0)
                    {
                        answer += x;
                    }
                    answer = new string(answer.ToCharArray().Reverse().ToArray());
                    return answer;
                }
                else
                {
 
                    string answer = "";
                    for (int i = s.Length - 1; i > -1; i--)
                    {
                        int x1;
 
 
                        x1 = Convert.ToInt32(s[i].ToString()) + Convert.ToInt32(s1[i].ToString()) + x;
                        if (x1 > 9)
                        {
                            x = x1 / 10;
                            x1 -= 10;
                        }
                        else
                            x = 0;
                        answer += x1.ToString();
 
 
 
 
 
 
 
                    }
                    if (x > 0)
                    {
                        answer += x;
                    }
                    answer = new string(answer.ToCharArray().Reverse().ToArray());
                    return answer;
                }
            }//сложение
Размещено в Без категории
Просмотров 542 Комментарии 10
Всего комментариев 10
Комментарии
  1. Старый комментарий
    Аватар для Usaga
    Но зачем?..
    Запись от Usaga размещена 23.03.2018 в 14:25 Usaga вне форума
  2. Старый комментарий
    Аватар для Puporev
    Цитата:
    в общем решил написать сам
    А до Вас никто не пользовался длинной арифметикой...
    Запись от Puporev размещена 23.03.2018 в 14:31 Puporev вне форума
  3. Старый комментарий
    Цитата:
    Сообщение от Usaga Просмотреть комментарий
    Но зачем?..
    потому что я , когда искал по всем сайтам , ничего не нашел
    Запись от student203 размещена 23.03.2018 в 19:21 student203 вне форума
  4. Старый комментарий
    Цитата:
    Сообщение от student203 Просмотреть комментарий
    потому что я , когда искал по всем сайтам , ничего не нашел
    не знаю пользовался или не пользовался , лично для меня было это новым
    Запись от student203 размещена 23.03.2018 в 19:22 student203 вне форума
  5. Старый комментарий
    Аватар для Usaga
    Это и для меня вновь. Никогда не видел, чтобы лечили зубы через задницу)
    Запись от Usaga размещена 23.03.2018 в 20:10 Usaga вне форума
  6. Старый комментарий
    Цитата:
    Сообщение от Usaga Просмотреть комментарий
    Это и для меня вновь. Никогда не видел, чтобы лечили зубы через задницу)
    все с чего-то начинают ) Буду рад посмотреть другие способы лечения зубов
    Запись от student203 размещена 24.03.2018 в 00:26 student203 вне форума
  7. Старый комментарий
    Запись от Rius размещена 24.03.2018 в 01:14 Rius вне форума
  8. Старый комментарий
    Аватар для Avazart
    И если все же делать самому, то наверное стоило сразу писать свой класс (и не через строки, а через массив int)
    Запись от Avazart размещена 24.03.2018 в 12:38 Avazart вне форума
  9. Старый комментарий
    Аватар для bedvit
    Цитата:
    Сообщение от student203 Просмотреть комментарий
    потому что я , когда искал по всем сайтам , ничего не нашел
    Странно, куча материала, посмотрите несколькими блогами выше мой, как раз эта тема.
    Запись от bedvit размещена 28.03.2018 в 00:22 bedvit вне форума
  10. Старый комментарий
    Аватар для bedvit
    Структура BigInteger По сравнению с MPIR или GMP - медленнее в 500 раз - замерял лично (парсинг строки в число и обратно, по мат. функциям уверен тоже).
    Запись от bedvit размещена 28.03.2018 в 00:23 bedvit вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru