Start learning free

LESSON 126 OF 410 · WHILE LOOPS & FOR LOOPS

Print Multiples in Java with Time Complexity O(A)

Practice Read the full explanation

Given two positive integers A and B, print to the console the first A positive numbers that are divisible by B

A number X is divisible by B if X modulo B == 0

Example:

Input: A = 5, B = 3

Output:
3
6
9
12
15

Explanation:
The first 5 positive integers that are divisible by 3 are
3, 6, 9, 12 and 15
1 modulo 3 = 1 => not divisible
2 modulo 3 = 2 => not divisible
3 modulo 3 = 0 => divisible
4 modulo 3 = 1 => not divisible
5 modulo 3 = 2 => not divisible
6 modulo 3 = 0 => divisible
7 modulo 3 = 1 => not divisible
8 modulo 3 = 2 => not divisible
9 modulo 3 = 0 => divisible
10 modulo 3 = 1 => not divisible
11 modulo 3 = 2 => not divisible
12 modulo 3 = 0 => divisible
13 modulo 3 = 1 => not divisible
14 modulo 3 = 1 => not divisible
15 modulo 3 = 2 => divisible
Hints:

If we look at the explanation, a simple algorithm comes to mind:
Start by iterating from 1 and check if it is divisible by B.
Keep a counter of how many numbers you printed so far.
Stop when you reached the A number of printed numbers.
STEP 1 OF 7
    Ctrl + Enter to check

    JAVA · WHILE LOOPS & FOR LOOPS

    Print Multiples in Java, explained

    Understanding the Problem

    The core challenge of this problem is to find the first A non-negative numbers that are divisible by B. This problem is significant in various applications such as generating sequences, scheduling tasks, and more. A common pitfall is to iterate through all numbers and check divisibility, which is inefficient.

    Approach

    To solve this problem, we can use a straightforward approach:

    1. Start iterating from 1.
    2. Check if the current number is divisible by B.
    3. If it is, print the number and increment the counter.
    4. Stop when the counter reaches A.

    This approach ensures that we only print the required numbers and stop as soon as we have printed A numbers.

    Naive Solution

    The naive solution involves iterating through all numbers and checking if each is divisible by B. This is not optimal because it may involve unnecessary checks.

    Optimized Solution

    An optimized solution involves directly calculating the multiples of B:

    1. Start from B and keep adding B to get the next multiple.
    2. Print each multiple until we have printed A numbers.

    This approach is more efficient as it directly generates the required multiples.

    Algorithm

    Here is a step-by-step breakdown of the optimized algorithm:

    1. Initialize a counter to 0.
    2. Start a loop from 1 to infinity.
    3. In each iteration, calculate the current multiple as currentMultiple = B * counter.
    4. Print the current multiple.
    5. Increment the counter.
    6. Stop the loop when the counter reaches A.

    Code Implementation

    public class PrintMultiples {
        public static void main(String[] args) {
            int A = 5; // Number of multiples to print
            int B = 3; // Divisor
    
            // Counter to keep track of how many multiples have been printed
            int count = 0;
    
            // Start from 1 and keep checking for multiples of B
            for (int i = 1; count < A; i++) {
                if (i % B == 0) {
                    System.out.println(i);
                    count++;
                }
            }
        }
    }
    

    Complexity Analysis

    The time complexity of the optimized solution is O(A) because we only iterate until we find A multiples. The space complexity is O(1) as we are not using any additional space.

    Edge Cases

    Potential edge cases include:

    • A or B being very large.
    • B being 1, which means every number is a multiple.

    These cases are handled by the algorithm as it directly calculates the multiples.

    Testing

    To test the solution comprehensively, consider the following test cases:

    • Simple cases like A = 5, B = 3.
    • Edge cases like A = 1, B = 1.
    • Large values like A = 1000, B = 100.

    Use a testing framework like JUnit to automate the tests.

    Thinking and Problem-Solving Tips

    When approaching such problems:

    • Understand the problem requirements clearly.
    • Think of a straightforward solution first.
    • Optimize the solution by reducing unnecessary computations.
    • Practice similar problems to improve problem-solving skills.

    Conclusion

    In this blog post, we discussed how to print the first A non-negative numbers divisible by B efficiently. We explored both naive and optimized solutions, analyzed their complexities, and provided a detailed Java implementation. Understanding and solving such problems is crucial for developing strong problem-solving skills.

    Additional Resources

    For further reading and practice, consider the following resources:

    Keep going with JavaAbout 340 step-by-step lessons, from your first line of code to coding interviews. Free to start.
    Start learning free