r351 vs r352
......
14961496
제일 높은 자리부터 내려오면서 처음으로 0이 아닌 수를 왼쪽으로 당기는 과정을 거쳤으므로 (1부터 시작하는 18자리+18자리 숫자)/(1부터 시작하는 18자리+18자리 수) 연산이 됩니다.
14971497
14981498
{{{#!if ps=false
1499
}}}숫자에서 해당하는 (10**n) 자리 이상 계산하지 않고 그 다음 자리(10**(n+1))의 몫을 계산하게 된다면 ps를 true로 바꿉니다.
1499
}}}ps를 false로 초기화합니다. 변수주는 여부로 ps를 사용합니다.
15001500
15011501
##i=0
15021502
{{{#!if br=false
......
15121512
{{{#!if tx=bu*tw, ty=bb*tw
15131513
}}}
15141514
이 때 ty가 19자리가 되면 넘친 첫번째 자리의 값을 tx의 일의 자리로 더하고 아래 18자리의 값을 ty로 다시 정의합니다. tx는 19자리 숫자가 되어도 문제가 없습니다. 만일 ty가 19자리가 되지 않는다면 tx와 ty를 그대로 둡니다. 그 다음 ty를 정수로 바꿉니다.
1515
{{{#!if ty=ty.toString(), tx=(ty.length==19)?tx+(+ty.substr(0,1)):tx, ty=(ty.length==19)?ty=ty.substr(1,18):ty, ty=+ty
1515
{{{#!if ty=ty.toString(), ps=(ty.length==19), tx=ps?tx+(+ty.substr(0,1)):tx, ty=ps?ty=ty.substr(1,18):ty, ty=+ty
15161516
}}}
15171517
이렇게 하면 tx=bu*tw<=au가 됩니다. (bu가 au보다 크면 tw는 tw의 정의에서 값이 0이 되므로 부등호가 성립됩니다.)
15181518
......
15211521
{{{#!if tw=(tw==0)?0:tw-1, tx=bu*tw, ty=bb*tw
15221522
}}}
15231523
마찬가지로 ty가 19자리가 된다면 넘친 첫번째 자리의 값을 tx의 일의 자리로 더합니다. 그 다음 ty를 정수로 바꿉니다.
1524
{{{#!if ty=ty.toString(), tx=(ty.length==19)?tx+(+ty.substr(0,1)):tx, ty=(ty.length==19)?ty=ty.substr(1,18):ty, ty=+ty
1524
{{{#!if ty=ty.toString(), ps=(ty.length==19), tx=ps?tx+(+ty.substr(0,1)):tx, ty=ps?ty=ty.substr(1,18):ty, ty=+ty
15251525
}}}
15261526
}}}
15271527
이렇게 만들어진 tx, ty가 있으면 이를 반영합니다.
......
15441544
{{{#!if au=au.toString(), ab=ab.toString()
15451545
}}}
15461546
tn을 빈 문자열로 초기화합니다. au가 여전히 18자리 숫자일 경우 au의 첫번째 자리를 분리해 내어 tn으로 정의하고 나머지 17자리를 au로 둡니다. 그렇지 않을 경우 (au가 17자리 미만의 숫자가 되었다면) tn은 빈 문자열 그대로 두고 au의 왼쪽을 0(pd)으로 채운 다음 (적어도 19자리가 되는 문자열을) 뒤에서 17번째 자리부터 가지고 와 au로 만듭니다.
1547
{{{#!if ps=false, tn="", tn=(au.length==18)?au.substr(0,1):"", au=(au.length==18)?au=au.substr(1,17):(pd+au).substr(-17)
1547
{{{#!if ps=false, tn="", ps=(au.length==18), tn=ps?au.substr(0,1):"", au=ps?au=au.substr(1,17):(pd+au).substr(-17)
15481548
}}}
15491549
ab가 18자리 미만의 숫자가 되었다면 왼쪽을 0으로 채워 18자리 숫자로 만듭니다.
15501550
{{{#!if ab=(ab.length<18)?(pd+ab).substr(-18):ab
......
15631563
au와 ab를 정수로 다시 바꾸고 tz를 0으로 초기화합니다. 그리고 tn이 빈 문자열이 아니라면 (앞에 au에서 한 자리 수를 떼온 것이므로) tn에 0을 더하여 19자리로 만들고 몫을 구합니다.
15641564
{{{#!if au=+au, ab=+ab, tz=0, tn!=""
15651565
tn을 19자리 정수로 바꿉니다.
1566
{{{#!if tn+=pd, tn=+tn,
1566
{{{#!if tn+=pd, tn=+tn
15671567
}}}
15681568
tz를 몫으로 정의합니다. 앞의 tw를 처리하는 방법과 같습니다. tn을 정수로 만들었으므로 소수점 아래를 비교한다면 정수의 소수점 아래에 해당하는 0과 비교합니다.
1569
{{{#!if tz=tn/bu, tx=bu*tz, ty=bb*tz
1570
}}}{{{#!if ty=ty.toString(), ty.length==19
1571
{{{#!if tx+=+(ty.substr(0,1)), ty=ty.substr(1,18)
1572
}}}}}}
1573
{{{#!if ty=+ty
1569
{{{#!if tz=tn/bu, tx=bu*tz, ty=bb*tz, ty=ty.toString()
15741570
}}}
1571
마찬가지로 ty가 19자리 숫자이면 1자리를 떼어 tx에 더합니다.
1572
{{{#!if ps=(ty.length==19), tx=ps?tx+(+ty.substr(0,1)):tx, ty=ps?ty=ty.substr(1,18):ty, ty=+ty
1573
}}}
1574
앞의 tw를 처리할 때 au와 tx를 비교한 것처럼 tz를 처리할 때 tn와 tx를 비교합니다.
15751575
{{{#!if (tx>tn)||((tx==tn)&&(ty>0))
1576
{{{#!if tz-=1, tx=bu*tz, ty=bb*tz
1577
}}}{{{#!if ty=ty.toString(), ty.length==19
1578
{{{#!if tx+=+(ty.substr(0,1)), ty=ty.substr(1,18)
1576
{{{#!if tz=(tz==0)?0:tz-1, tx=bu*tz, ty=bb*tz
1577
}}}{{{#!if ty=ty.toString(), ps=(ty.length==19), tx=ps?tx+(+ty.substr(0,1)):tx, ty=ps?ty=ty.substr(1,18):ty, ty=+ty
15791578
}}}}}}
1580
{{{#!if ty=+ty
1581
}}}}}}
15821579
tn에서 나누어떨어지는 값을 뺀 나머지를 반영하여 au, ab에 더합니다. 소수점 아래 부분인 ab보다 ty가 크다면 tn에서 1을 빼어 계산합니다.
15831580
{{{#!if ty>ab
15841581
{{{#!if tn-=1, ab+=+("1"+pd)
......