| r79 vs r80 | ||
|---|---|---|
| ... | ... | |
| 159 | 159 | 뺄셈은 덧셈의 역연산이고 구조가 단순하므로 덧셈과 뺄셈을 먼저 같이 처리합니다. ru, rb는 각각 정수 값으로 나올 것입니다. |
| 160 | 160 | {{{#!if ru=(+au)-(+bu), rb=(+ab)-(+bb) |
| 161 | 161 | }}}}}} |
| 162 | ||
| 163 | {{{#!if (f=="+")||(f=="-") | |
| 164 | 덧셈 또는 뺄셈 연산으로 나온 값을 정리합니다. | |
| 165 | ||
| 162 | 166 | 소수점 아래끼리 더한 자릿수가 얼마나 되는지 보기 위해 rb를 문자열로 바꿉니다. |
| 163 | 167 | {{{#!if this.rb=rb.toString() |
| 164 | 168 | }}} |
| ... | ... | |
| 170 | 174 | {{{#!if rp=rp-1 |
| 171 | 175 | }}}}}} |
| 172 | 176 | |
| 177 | Case 1 : ru가 0보다 큰 경우 | |
| 173 | 178 | ru는 정수이므로 ru가 0보다 크면 곧 ru는 1 이상의 정수이며, 1 이상이면 a+b 또는 a-b가 양수+음수 꼴이 되더라도 소수점 아래 정리를 하면 됩니다. rb를 정리하는 과정에서 ru에서 1을 빌려오거나 ru에 1이 더해질 수도 있습니다. 앞에서 rb를 string으로 바꿨으므로 +rb를 다룹니다. |
| 174 | 179 | {{{#!if ru>0 |
| 180 | Case 1-1 : rb가 0 이상인 경우 | |
| 175 | 181 | {{{#!if +rb>=0 |
| 176 | 182 | rb가 소수점 아래 자릿수를 초과하여 소수점 위의 수를 계산하게 생겼다면 ap=bp인 상황에서 rp>ap가 됩니다. rb는 첫 숫자가 1인 정수가 되므로 첫 숫자인 1을 삭제한 문자열로 정의합니다. |
| 177 | 183 | {{{#!if rp>ap |
| ... | ... | |
| 182 | 188 | }}} |
| 183 | 189 | }}} |
| 184 | 190 | |
| 185 | rb가 음수가 되는 경우 ru에서 1을 빌려옵니다. 1보다 작은 값에서 1보다 작은 값을 빼므로 -1보다 작을 수 없으며, 소수점 아래 자릿수가 초과되지 않습니다. | |
| 191 | Case 1-2 : rb가 음수가 되는 경우 ru에서 1을 빌려옵니다. 1보다 작은 값에서 1보다 작은 값을 빼므로 -1보다 작을 수 없으며, 소수점 아래 자릿수가 초과되지 않습니다. | |
| 186 | 192 | {{{#!if +rb<0 |
| 187 | 193 | {{{#!if ru=ru-1 |
| 188 | 194 | }}} |
| 189 | rb의 자릿수인 rp만큼 10을 제곱한 값으로 rb를 재정의 | |
| 190 | {{{#!if rb= | |
| 195 | rb의 자릿수인 rp만큼 10을 제곱한 값으로 rb를 재정의합니다. 그러면 rb는 양수가 되며, rb를 다시 문자열로 변환합니다. | |
| 196 | {{{#!if rb=10**rp+(+rb) | |
| 191 | 197 | }}}{{{#!if rb=rb.toString() |
| 192 | 198 | }}} |
| 193 | 199 | }}} |
| 200 | ||
| 194 | 201 | 정리과정을 끝냈으면 ru를 string으로 변환합니다. |
| 195 | 202 | {{{#!if this.ru=ru.toString() |
| 196 | 203 | }}}}}} |
| 197 | 204 | |
| 198 | ru가 0이 되면 rb의 값이 양수인지 음수인지에 따라 달라집니다. | |
| 205 | Case 2 : ru가 0인 경우 ru가 0이 되면 rb의 값이 양수인지 음수인지에 따라 달라집니다. | |
| 199 | 206 | {{{#!if ru==0 |
| 207 | Case 2-1 : rb가 0 이상인 경우 | |
| 200 | 208 | {{{#!if +rb>=0 |
| 201 | 209 | rb가 양수이면서 rb가 자릿수를 초과한 경우 rb는 첫 숫자가 1인 정수가 되므로 첫 숫자인 1을 삭제한 문자열로 정의합니다. |
| 202 | 210 | {{{#!if rp>ap |
| 203 | 211 | {{{#!if ru=ru+1, rb=rb.substr(1, rp-1) |
| 204 | 212 | }}}}}}}}} |
| 205 | rb가 음수인 경우 | |
| 213 | Case 2-2 : rb가 음수인 경우 | |
| 206 | 214 | {{{#!if +rb<0 |
| 207 | rb가 음수이면서 rb가 자릿수를 초과한 경우 값이 0인 ru에 1을 빼야 합니다. 그리고 rb가 "-"+숫자 꼴이므로 문자열의 1번 index에 해당하는 1을 지워야 합니다. 앞에서 rb가 음수인 경우 rp는 rb의 마이너스(-)가 차지하는 자릿수를 계산하지 않은 값 곧 숫자들이 차지하는 자릿수이므로 | |
| 215 | rb가 음수이면서 rb가 자릿수를 초과한 경우 값이 0인 ru에 1을 빼야 합니다. 그리고 rb가 "-"+숫자 꼴이므로 문자열의 1번 index에 해당하는 1을 지워야 합니다. 앞에서 rb가 음수인 경우 rp는 rb의 마이너스(-)가 차지하는 자릿수를 계산하지 않은 값 곧 숫자들이 차지하는 자릿수이므로, rb를 길이가 rp-1인 숫자들로 다시 정의합니다. | |
| 208 | 216 | {{{#!if rp>ap |
| 209 | {{{#!if ru=ru-1, rb="-" | |
| 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) | |
| 210 | 222 | }}}}}}}}} |
| 211 | ||
| 212 | 223 | 정리과정을 끝냈으면 ru를 string으로 변환합니다. |
| 213 | 224 | {{{#!if this.ru=ru.toString() |
| 214 | 225 | }}} |
| 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 | }}}}}} | |
| 215 | 231 | }}} |
| 216 | 232 | |
| 233 | Case 3 : ru가 0보다 작은 경우. 곧 -1 이하인 음수가 되는 경우. | |
| 217 | 234 | {{{#!if ru<0 |
| 218 | 235 | }}} |
| 236 | }}} | |
| 219 | 237 | |
| 220 | ||
| 221 | ||
| 222 | 238 | {{{#!if f=="*" |
| 223 | 239 | 18자리 숫자로 입력할 수 있는 최대 정수는 999,999,999,999,999,999입니다. |
| 224 | 240 | 다행히 999,999,999,999,999,999*9=8,999,999,999,999,999,991 < long 한계치 9,223,372,036,854,775,807 이라서 a*각 자릿수로 덧셈해볼 수는 있습니다. |
| ... | ... |