- 大数相加
/**
* [add0Before description] 给String类型的a前面补充num0个0, 返回补充0后的字符串
* @param {[String]} a [数字类型的字符串]
* @param {[Integer]} num0 [补充的0的个数]
* @return {[String]} [返回长度为a.length+num0]的长度的字符串
*/
function add0Before(a, num0) {
if (num0 <= 0) {
return a;
}
for (var i = 0, length = num0; i < length; i++) {
a = '0' + a;
}
return a;
}
/**
* [大数相加]
* @param {[Array]} a [数组a, 里面是字符串类型的个位数]
* @param {[Array]} b [数组a, 里面是字符串类型的个位数]
* @return {[Array]} [返回相加之和的数组]
*/
function plus(a, b) {
//a, b 两数串位数统一
var aLength = a.length,
bLength = b.length,
// 数组长度相差绝对值
extra0 = Math.abs(aLength - bLength),
// 对新数组进行操作, 重命名
newA = a,
newB = b,
// 记录结果字符串
newC = '',
// 记录结果数组的长度
lastLength,
// 标记进位
takeOver = 0;
// 对短的数组进行补位0处理
if (aLength < bLength) {
newA = add0Before(a, extra0);
} else {
newB = add0Before(b, extra0);
}
// newA+newB newA的长度和newB的长度是一样的
lastLength = newA.length;
for (var i = lastLength - 1; i >= 0; i--) {
// 从后往前相加, takeOver 表示上一次相加的进位值
var nSum = parseInt(newA[i]) + parseInt(newB[i]) + takeOver;
if (nSum >= 10) {
takeOver = 1;
// 相加的和大于10的话, newC表示要存进字符串中的值, 需要减掉10
newC = (nSum - 10) + newC;
} else {
takeOver = 0;
// 此时无进位, 将nSum加载原有字符串的头部; (ps: 这里是字符串相加)
newC = nSum + newC;
}
}
// 第一位的时候 需要处理的进位处理 比如: 808+102 = 1000
if (takeOver === 1) {
newC = 1 + newC;
}
return newC;
}
// console.log(plus('0', '0'))
console.log(plus("1234123412341234123412341234", "12341234"))
// 0 +1 + .....99999999 (n)
网友评论