+6

Phỏng vấn Javascript - Tính tổng của một chữ số

Series các bài viết ngắn chia sẻ Tips Javascript giúp code nhanh và kiến thức phỏng vấn Javascript.

FinX

Câu hỏi

Cho một số n lớn hơn 0, tính tổng của các chữ số n. Nếu tổng của số n có nhiều hơn một chữ số, tiếp tục tính tổng của kết quả đó cho tới khi kết quả quả chỉ còn một số. Ví dụ:

    16  -->  1 + 6 = 7
   942  -->  9 + 4 + 2 = 15  -->  1 + 5 = 6
132189  -->  1 + 3 + 2 + 1 + 8 + 9 = 24  -->  2 + 4 = 6

Giải pháp

Để giải đề này bước đầu tiên ta cần phương pháp tách một số lớn thành ra từng số đơn vị và cộng chúng lại với nhau, ví dụ với số 942 ta cần tách nó thành 9, 4, 2, ta sẽ làm thế nào?

Cách phổ biến để làm việc này là ta thực hiện chia lấy phần nguyên và chia lấy phần dư của 10:

942 % 10 = 2
942 / 10 = 94

94 % 10 = 4
94 / 10 = 9

9 % 10 = 9
9 / 10 = 0

Sau đó ta tổng hợp phần dư ta có được từng số đơn vị của một số lớn => 9, 4, 2. Trong javascript chia lấy phần dư ta dùng phép toán %, còn chia lấy phần nguyên thì ta sử dụng phép toán / và hàm Math.floor. Ví dụ: 942 / 10 = 94.2 => Math.floor(94.2) = 94.

Ta thực hiện viết hàm tách số theo từng bước như sau:

function extract(n) {
    let r = n % 10
    console.log("Remainder: ", r)

    let i = Math.floor(n / 10)
    console.log("Integer: ", i)
}

extract(942)
// Remainder:  2
// Integer:  94

Tiếp theo để hàm thực thi cho tới đơn vị cuối cùng thì ta cần sử dụng phương pháp đệ quy:

function extract(n) {
    if (n === 0) {
        return
    }

    let r = n % 10
    console.log("---------")
    console.log("Remainder: ", r)

    let i = Math.floor(n / 10)
    console.log("Integer: ", i)

    extract(i)
}

extract(942)
Remainder:  2
Integer:  94
---------
Remainder:  4
Integer:  9
---------
Remainder:  9
Integer:  0

Để tính tổng ta định nghĩa thêm cho hàm một argument thứ hai và truyền giá trị ban đầu cho nó là 0:

function extract(n, t) {
    if (n === 0) {
        return t;
    }

    let r = n % 10
    let i = Math.floor(n / 10)
    
    t += r

    return extract(i, t)
}

console.log(extract(942, 0)) // 15

Cuối cùng, để thực hiện việc kiểm tra kết quả của hàm extract có lớn hơn hai chữ số hay không để thực hiện tiếp công việc thì ta nên tách ra một hàm khác. Việc này giúp code dễ hiểu và dễ thực hiện hơn. Ta định nghĩa thêm một hàm gọi là digitalRoot:

function digitalRoot(n) {
    if (Math.floor(n / 10) === 0) {
        return n
    }

    n = extract(n, 0)

    return digitalRoot(n)
}

Ở hàm này ta kiểm tra nếu n lớn hai chữ số thì ta tiếp tục thực hiện tách số với hàm extract, ngược lại ta trả kết quả về.

Đáp án

function digitalRoot(n) {
    if (Math.floor(n / 10) === 0) {
        return n
    }

    n = extract(n, 0)

    return digitalRoot(n)
}

function extract(n, t) {
    if (n === 0) {
        return t;
    }

    let r = n % 10
    let i = Math.floor(n / 10)
    
    t += r

    return extract(i, t)
}

digitalRoot(16)     // 7
digitalRoot(942)    // 6
digitalRoot(132189) // 6

Hi vọng kiến thức này hữu ích cho các bạn.

Công thức toán học

Đề bài này được gọi là digital root và có công thức sẵn như sau, nếu các bạn thích giải nhanh thì có thể tham khảo:

function digitalRoot(n) {
    return n === 0 ? 0 : 1 + ((n - 1) % 9);
}

Các bạn tìm hiểu thêm về công thức ở đây: Digital Root.

Frontend VN

Theo dõi FB hoặc Tiktok của Frontend VN để cập nhật kiến thức và tips về FE mỗi ngày 🥰.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí