r79 vs r80
......
159159
뺄셈은 덧셈의 역연산이고 구조가 단순하므로 덧셈과 뺄셈을 먼저 같이 처리합니다. ru, rb는 각각 정수 값으로 나올 것입니다.
160160
{{{#!if ru=(+au)-(+bu), rb=(+ab)-(+bb)
161161
}}}}}}
162
163
{{{#!if (f=="+")||(f=="-")
164
덧셈 또는 뺄셈 연산으로 나온 값을 정리합니다.
165
162166
소수점 아래끼리 더한 자릿수가 얼마나 되는지 보기 위해 rb를 문자열로 바꿉니다.
163167
{{{#!if this.rb=rb.toString()
164168
}}}
......
170174
{{{#!if rp=rp-1
171175
}}}}}}
172176
177
Case 1 : ru가 0보다 큰 경우
173178
ru는 정수이므로 ru가 0보다 크면 곧 ru는 1 이상의 정수이며, 1 이상이면 a+b 또는 a-b가 양수+음수 꼴이 되더라도 소수점 아래 정리를 하면 됩니다. rb를 정리하는 과정에서 ru에서 1을 빌려오거나 ru에 1이 더해질 수도 있습니다. 앞에서 rb를 string으로 바꿨으므로 +rb를 다룹니다.
174179
{{{#!if ru>0
180
Case 1-1 : rb가 0 이상인 경우
175181
{{{#!if +rb>=0
176182
rb가 소수점 아래 자릿수를 초과하여 소수점 위의 수를 계산하게 생겼다면 ap=bp인 상황에서 rp>ap가 됩니다. rb는 첫 숫자가 1인 정수가 되므로 첫 숫자인 1을 삭제한 문자열로 정의합니다.
177183
{{{#!if rp>ap
......
182188
}}}
183189
}}}
184190
185
rb가 음수가 되는 경우 ru에서 1을 빌려옵니다. 1보다 작은 값에서 1보다 작은 값을 빼므로 -1보다 작을 수 없으며, 소수점 아래 자릿수가 초과되지 않습니다.
191
Case 1-2 : rb가 음수가 되는 경우 ru에서 1을 빌려옵니다. 1보다 작은 값에서 1보다 작은 값을 빼므로 -1보다 작을 수 없으며, 소수점 아래 자릿수가 초과되지 않습니다.
186192
{{{#!if +rb<0
187193
{{{#!if ru=ru-1
188194
}}}
189
rb의 자릿수인 rp만큼 10을 제곱한 값으로 rb를 재정의 rb를 다시 문자열로 변환합니다.
190
{{{#!if rb=(+rb)+10**rp
195
rb의 자릿수인 rp만큼 10을 제곱한 값으로 rb를 재정의합니. 그러면 rb는 양수가 되며, rb를 다시 문자열로 변환합니다.
196
{{{#!if rb=10**rp+(+rb)
191197
}}}{{{#!if rb=rb.toString()
192198
}}}
193199
}}}
200
194201
정리과정을 끝냈으면 ru를 string으로 변환합니다.
195202
{{{#!if this.ru=ru.toString()
196203
}}}}}}
197204
198
ru가 0이 되면 rb의 값이 양수인지 음수인지에 따라 달라집니다.
205
Case 2 : ru가 0인 경우 ru가 0이 되면 rb의 값이 양수인지 음수인지에 따라 달라집니다.
199206
{{{#!if ru==0
207
Case 2-1 : rb가 0 이상인 경우
200208
{{{#!if +rb>=0
201209
rb가 양수이면서 rb가 자릿수를 초과한 경우 rb는 첫 숫자가 1인 정수가 되므로 첫 숫자인 1을 삭제한 문자열로 정의합니다.
202210
{{{#!if rp>ap
203211
{{{#!if ru=ru+1, rb=rb.substr(1, rp-1)
204212
}}}}}}}}}
205
rb가 음수인 경우
213
Case 2-2 : rb가 음수인 경우
206214
{{{#!if +rb<0
207
rb가 음수이면서 rb가 자릿수를 초과한 경우 값이 0인 ru에 1을 빼야 합니다. 그리고 rb가 "-"+숫자 꼴이므로 문자열의 1번 index에 해당하는 1을 지워야 합니다. 앞에서 rb가 음수인 경우 rp는 rb의 마이너스(-)가 차지하는 자릿수를 계산하지 않은 값 곧 숫자들이 차지하는 자릿수이므로 substr에서 문자열 길이 rp-1로 니다.
215
rb가 음수이면서 rb가 자릿수를 초과한 경우 값이 0인 ru에 1을 빼야 합니다. 그리고 rb가 "-"+숫자 꼴이므로 문자열의 1번 index에 해당하는 1을 지워야 합니다. 앞에서 rb가 음수인 경우 rp는 rb의 마이너스(-)가 차지하는 자릿수를 계산하지 않은 값 곧 숫자들이 차지하는 자릿수이므로, rb 길이 rp-1인 숫자들다시 정의합니다.
208216
{{{#!if rp>ap
209
{{{#!if ru=ru-1, rb="-"+rb.substr(2, rp-1)
217
{{{#!if ru=ru-1, rb=rb.substr(2, rp-1)
218
}}}}}}
219
rb가 자릿수를 초과하지 않은 경우 rb에서 "-"를 뺀 문자열로 rb를 다시 정의합니다.
220
{{{#if rp==ap
221
{{{#!if rb=rb.substr(1, rp-1)
210222
}}}}}}}}}
211
212223
정리과정을 끝냈으면 ru를 string으로 변환합니다.
213224
{{{#!if this.ru=ru.toString()
214225
}}}
226
-0.xxxx 같이 (ru==0인데) 연산결과가 -1보다 큰 음수로 나오는 경우 ru 문자열 앞에 "-"를 붙입니다.
227
f가 "+"인지 "-"인지에 따라 처음 rb를 정의할 때 적었던 식을 다시 불러옵니다.
228
{{{#!if ((f=="+")&&((+ab)+(+bb)<0))||((f=="-")&&((+ab)-(+bb)<0))
229
{{{#!if ru="-"+ru
230
}}}}}}
215231
}}}
216232
233
Case 3 : ru가 0보다 작은 경우. 곧 -1 이하인 음수가 되는 경우.
217234
{{{#!if ru<0
218235
}}}
236
}}}
219237
220
221
222238
{{{#!if f=="*"
223239
18자리 숫자로 입력할 수 있는 최대 정수는 999,999,999,999,999,999입니다.
224240
다행히 999,999,999,999,999,999*9=8,999,999,999,999,999,991 < long 한계치 9,223,372,036,854,775,807 이라서 a*각 자릿수로 덧셈해볼 수는 있습니다.
......