Created
August 24, 2011 02:48
-
-
Save rillflow/1167192 to your computer and use it in GitHub Desktop.
JS String Pow
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var go = {}; | |
// 밑 x, 지수 n | |
go.x = 2; | |
go.n = 10000; | |
// 정수 x의 자릿수를 구함 (공식 : log10(x) + 1) | |
// log10 함수가 제공되지 않으므로 밑변환 공식 사용 | |
// log10(x) = log(x) / log(10) | |
go.numberLength = function (x) { | |
if (x != 0) { | |
return Math.round((Math.log(x) / Math.log(10)) + 1); | |
} else { | |
return 1; | |
} | |
}; | |
/* | |
* 위 함수와 똑같은 기능 | |
* 프로토타입 상속 기반으로, 사용하기엔 편하지만 속도가 느림 | |
Number.prototype.length = function () { | |
if (this != 0) { | |
return Math.round((Math.log(this) / Math.log(10)) + 1); | |
} else { | |
return 1; | |
} | |
}; | |
*/ | |
// 정수 x의 n번째 수를 구함 | |
go.nOfx = function (x, n) { | |
var result = x; | |
for (i = 1; i < n; i += 1) { | |
result = parseInt(result / 10, 10); | |
} | |
return result % 10; | |
}; | |
// 숫자를 숫자배열로 변환 | |
Number.prototype.toArray = function () { | |
var str = this + '', len = str.length; | |
var i, arr = []; | |
for (i = 0; i < len; i += 1) { | |
arr[i] = str[i]; | |
} | |
return arr; // 뒤집어야 계산하기 편함 | |
}; | |
// 숫자배열을 문자열로 변환 | |
Array.prototype.toString = function (prefix) { | |
if (this[0] === 0) { // 첫자리 0 제거 | |
this.shift(); | |
} | |
var result = prefix ? prefix : ''; | |
var i, len = this.length; | |
for (i = 0; i < len; i += 1) { | |
result += this[i]; | |
} | |
return result; | |
}; | |
// 계산 | |
go.compute = function () { | |
var absX = Math.abs(this.x); | |
var prefix = (this.x != absX && this.n % 2 === 1) ? '-' : ''; | |
var arr = absX.toArray().reverse(); // 계산 편의상 배열 뒤집음 | |
var l = this.n > 1 ? [] : arr; | |
var i, j, k, len, temp, tempLen; | |
for (i = 1; i < this.n; i += 1) { // n제곱 | |
len = arr.length; | |
for (j = 0; j < len; j += 1) { // 숫자배열 각 자리별 곱셈 | |
temp = arr[j] * absX; | |
tempLen = go.numberLength(temp); | |
for (k = 0; k < tempLen; k += 1) { | |
if (j + k >= l.length) { | |
l[j + k] = 0; | |
} | |
l[j + k] += go.nOfx(temp, k + 1); | |
} | |
} | |
arr = l; | |
l = []; | |
} | |
arr.reverse(); // 처음에 뒤집었던 것 다시 원래대로 | |
return arr.toString(prefix); | |
}; | |
//go.compute() | |
console.log( go.compute() ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment