nfssuzukaze / Blog

0 stars 0 forks source link

高精度整数的加减乘除 #16

Open nfssuzukaze opened 3 years ago

nfssuzukaze commented 3 years ago

高精度整数的加减乘除

1. 高精度整数的加法

const add = (a, b) => {
    const numberA = a.split('').reverse()
    const numberB = b.split('').reverse()
    const result = []
    for (let i = 0, carry = 0; i < numberA.length || i < numberB.length || carry; i ++) {
        if (i < numberA.length) carry += numberA[i] - 0
        if (i < numberB.length) carry += numberB[i] - 0
        result.push(carry % 10)
        carry = carry / 10 >> 0
    }
    return result.reverse().join('')
}

2. 高精度整数的减法

const sub = (a, b) => {
    const numberA = a.split('').reverse()
    const numberB = b.split('').reverse()
    const result = []
    for (let i = 0, carry = 0, sum = 0; i < numberA.length; i ++) {
        sum = numberA[i] - carry
        if (i < numberB.length) sum -= numberB[i]
        result.push((sum + 10) % 10)
        if (sum < 0) carry = 1
    }
    while (result[result.length - 1] === 0 && result.length > 1) result.pop()
    return result.reverse().join('')
}

3. 高精度整数与低精度整数的乘法

const mul = (a, b) => {
    const numberA = a.split('').reverse()
    const result = []
    for (let i  = 0, carry = 0; i < numberA.length || carry; i ++) {
    if (i < numberA.length) carry += (numberA[i] - 0) * b
        result.push(carry % 10)
        carry = carry / 10 >> 0
    }
    return result.reverse().join('')
}

4. 高精度整数与低精度整数的除法

const div = (a, b) => {
    const numberA = a.split('').reverse()
    const result = []
    for (let i = numberA.length - 1, carry = 0; i >= 0; i --) {
        carry = carry * 10 + (numberA[i] - 0)
        result.push(carry / b >> 0)
        carry %= b
    }
    while (result[0] === 0 && result.length > 1) result.shift()
    return result.join('')
}