Skip to content

Instantly share code, notes, and snippets.

@rillflow
Created August 24, 2011 02:48
Show Gist options
  • Save rillflow/1167192 to your computer and use it in GitHub Desktop.
Save rillflow/1167192 to your computer and use it in GitHub Desktop.
JS String Pow
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