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.
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.
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 🥰.