Overflow in intermediate arithmetic
Wrong move: Temporary multiplications exceed integer bounds.
Usually fails on: Large inputs wrap around unexpectedly.
Fix: Use wider types, modular arithmetic, or rearranged operations.
Build confidence with an intuition-first walkthrough focused on math fundamentals.
Given an integer num, return the number of digits in num that divide num.
An integer val divides nums if nums % val == 0.
Example 1:
Input: num = 7 Output: 1 Explanation: 7 divides itself, hence the answer is 1.
Example 2:
Input: num = 121 Output: 2 Explanation: 121 is divisible by 1, but not 2. Since 1 occurs twice as a digit, we return 2.
Example 3:
Input: num = 1248 Output: 4 Explanation: 1248 is divisible by all of its digits, hence the answer is 4.
Constraints:
1 <= num <= 109num does not contain 0 as one of its digits.Problem summary: Given an integer num, return the number of digits in num that divide num. An integer val divides nums if nums % val == 0.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Math
7
121
1248
happy-number)self-dividing-numbers)Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #2520: Count the Digits That Divide a Number
class Solution {
public int countDigits(int num) {
int ans = 0;
for (int x = num; x > 0; x /= 10) {
if (num % (x % 10) == 0) {
++ans;
}
}
return ans;
}
}
// Accepted solution for LeetCode #2520: Count the Digits That Divide a Number
func countDigits(num int) (ans int) {
for x := num; x > 0; x /= 10 {
if num%(x%10) == 0 {
ans++
}
}
return
}
# Accepted solution for LeetCode #2520: Count the Digits That Divide a Number
class Solution:
def countDigits(self, num: int) -> int:
ans, x = 0, num
while x:
x, val = divmod(x, 10)
ans += num % val == 0
return ans
// Accepted solution for LeetCode #2520: Count the Digits That Divide a Number
impl Solution {
pub fn count_digits(num: i32) -> i32 {
let mut ans = 0;
let mut cur = num;
while cur != 0 {
if num % (cur % 10) == 0 {
ans += 1;
}
cur /= 10;
}
ans
}
}
// Accepted solution for LeetCode #2520: Count the Digits That Divide a Number
function countDigits(num: number): number {
let ans = 0;
for (let x = num; x; x = (x / 10) | 0) {
if (num % (x % 10) === 0) {
++ans;
}
}
return ans;
}
Use this to step through a reusable interview workflow for this problem.
Simulate the process step by step — multiply n times, check each number up to n, or iterate through all possibilities. Each step is O(1), but doing it n times gives O(n). No extra space needed since we just track running state.
Math problems often have a closed-form or O(log n) solution hidden behind an O(n) simulation. Modular arithmetic, fast exponentiation (repeated squaring), GCD (Euclidean algorithm), and number theory properties can dramatically reduce complexity.
Review these before coding to avoid predictable interview regressions.
Wrong move: Temporary multiplications exceed integer bounds.
Usually fails on: Large inputs wrap around unexpectedly.
Fix: Use wider types, modular arithmetic, or rearranged operations.