r77 vs r78
......
1010
'''ab''' : "a" below value (string→integer); '''bb''' : "b" below value (string→integer);
1111
'''ap''' : "a" # of places of decimal (integer); '''bp''' : "b" # of places of decimal (integer);
1212
0.303과 0.0303은 다른 수이므로 자리수가 다름을 표시할 용도
13
'''ru''' : "result" upper value (integer→string); '''rb''' : "result" below value (integer→string); '''rp''' : "result" # of places of decimal (integer)
13
'''ru''' : "result" upper value (integer→string); '''rb''' : "result" below value (integer→string);
14
'''rp''' : "result" # of places of decimal (integer);
1415
{{{#!if this.as=a.toString(), this.bs=b.toString(), this.ru=0+0, this.rb=0+0
1516
}}}{{{#!if this.al=as.length, this.bl=bs.length, this.ad=as.indexOf("."), this.bd=bs.indexOf(".")
1617
}}}{{{#!if ad!=-1
......
164165
문자열로 된 rb의 길이를 rp로 정의합니다.
165166
{{{#!if this.rp=rb.length
166167
}}}
167
rb가 음수이면 rp를 -1 줄여 정의합니다. ap, bp는 마이너스를 붙이기 전에 고정되어 있으므로 줄일 필요가 없습니다.
168
rb가 음수이면 rb의 첫번째(0번 index)의 문자열에는 마이너스(-)가 들어갑니다. 이 때는 rp를 rb의 마이너스 문자열을 세지 않은 자릿수가 되도록 앞에서 정의했던 rb.length에서 1만큼 줄여 정의합니다. ap, bp는 마이너스를 붙이기 전에 값이 고정되어 있으므로 rp처럼 줄일 필요가 없습니다.
168169
{{{#!if rb[0]==45
169170
{{{#!if rp=rp-1
170171
}}}}}}
......
172173
ru는 정수이므로 ru가 0보다 크면 곧 ru는 1 이상의 정수이며, 1 이상이면 a+b 또는 a-b가 양수+음수 꼴이 되더라도 소수점 아래 정리를 하면 됩니다. rb를 정리하는 과정에서 ru에서 1을 빌려오거나 ru에 1이 더해질 수도 있습니다. 앞에서 rb를 string으로 바꿨으므로 +rb를 다룹니다.
173174
{{{#!if ru>0
174175
{{{#!if +rb>=0
175
rb가 자릿수를 초과 경우 ap=bp인 상황에서 rp>ap가 됩니다. rb는 첫 숫자가 1인 정수가 되므로 첫 숫자인 1을 삭제한 문자열로 정의합니다.
176
rb가 소수점 아래 자릿수를 초과하여 소수점 위의 수를 계산하게 생겼다면 ap=bp인 상황에서 rp>ap가 됩니다. rb는 첫 숫자가 1인 정수가 되므로 첫 숫자인 1을 삭제한 문자열로 정의합니다.
176177
{{{#!if rp>ap
177178
{{{#!if ru=ru+1, rb=rb.substr(1, rp-1)
178179
}}}}}}
179
rb가 자릿수를 초과하지 않을 경우 rb를 다시 정의할 필요 없이 그대로 둡니다.
180
rb가 소수점 아래 자릿수를 초과하지 않을 경우 rb를 다시 정의할 필요 없이 그대로 둡니다.
180181
{{{#!if rp<=ap
181182
}}}
183
}}}
184
185
rb가 음수가 되는 경우 ru에서 1을 빌려옵니다. 1보다 작은 값에서 1보다 작은 값을 빼므로 -1보다 작을 수 없으며, 소수점 아래 자릿수가 초과되지 않습니다.
186
{{{#!if +rb<0
187
{{{#!if ru=ru-1
188
}}}
189
rb의 자릿수인 rp만큼 10을 제곱한 값으로 rb를 재정의한 다음 rb를 다시 문자열로 변환합니다.
190
{{{#!if rb=(+rb)+10**rp
191
}}}{{{#!if rb=rb.toString()
192
}}}
193
}}}
194
정리과정을 끝냈으면 ru를 string으로 변환합니다.
195
{{{#!if this.ru=ru.toString()
182196
}}}}}}
183197
198
ru가 0이 되면 rb의 값이 양수인지 음수인지에 따라 달라집니다.
184199
{{{#!if ru==0
200
{{{#!if +rb>=0
201
rb가 양수이면서 rb가 자릿수를 초과한 경우 rb는 첫 숫자가 1인 정수가 되므로 첫 숫자인 1을 삭제한 문자열로 정의합니다.
202
{{{#!if rp>ap
203
{{{#!if ru=ru+1, rb=rb.substr(1, rp-1)
204
}}}}}}}}}
205
rb가 음수인 경우
206
{{{#!if +rb<0
207
rb가 음수이면서 rb가 자릿수를 초과한 경우 값이 0인 ru에 1을 빼야 합니다. 그리고 rb가 "-"+숫자 꼴이므로 문자열의 1번 index에 해당하는 1을 지워야 합니다. 앞에서 rb가 음수인 경우 rp는 rb의 마이너스(-)가 차지하는 자릿수를 계산하지 않은 값 곧 숫자들이 차지하는 자릿수이므로 substr에서 문자열 길이를 rp-1로 둡니다.
208
{{{#!if rp>ap
209
{{{#!if ru=ru-1, rb="-"+rb.substr(2, rp-1)
210
}}}}}}}}}
211
212
정리과정을 끝냈으면 ru를 string으로 변환합니다.
213
{{{#!if this.ru=ru.toString()
185214
}}}
215
}}}
216
}}}
186217
{{{#!if ru<0
187218
}}}
188219
189220
221
190222
{{{#!if f=="*"
191223
18자리 숫자로 입력할 수 있는 최대 정수는 999,999,999,999,999,999입니다.
192224
다행히 999,999,999,999,999,999*9=8,999,999,999,999,999,991 < long 한계치 9,223,372,036,854,775,807 이라서 a*각 자릿수로 덧셈해볼 수는 있습니다.
......