A positive integer d is a common divisor of a and b when it divides both numbers with remainder 0. The largest common divisor is the GCD (greatest common divisor).
Remember
d is a common divisor of a and b
⇔ a % d == 0 and b % d == 0
Key fact:
common divisors of (a, b) = all divisors of gcd(a, b)
Example: a = 12, b = 18
gcd = 6
common divisors = 1, 2, 3, 6
a
b
Common divisors
GCD
12
18
1, 2, 3, 6
6
7
13
1
1
24
36
1, 2, 3, 4, 6, 12
12
Approach
How to Find Common Divisors in Python
Four clear steps — then pick a basic loop or a GCD-based scan.
Take absolute values of a and b (divisors are about magnitude).
Reject the case where both values are 0 (no finite list).
Either scan 1 … min(a, b), or compute math.gcd and list its divisors.
Collect and print the common divisors (and optionally the GCD).
Method
Idea
Time
Best for
Naive loop
Test every i from 1 to min(a, b)
O(min)
Interviews, small inputs
GCD + divisors
Find g = gcd(a, b), then list divisors of g
O(log min + g)
Clearer math
Pseudocode
Pseudocode
function CommonDivisors(a, b):
a = abs(a)
b = abs(b)
if a == 0 and b == 0:
reject input
limit = min(a, b) // if one is 0, use the other
if limit == 0:
limit = max(a, b)
for i from 1 to limit:
if a mod i == 0 and b mod i == 0:
print i
Reference
Cheat Sheet
Keep these facts handy while writing the program.
Topic
Detail
Test
a % d == 0 and b % d == 0
Upper bound
Scan only to min(|a|, |b|)
GCD shortcut
Common divisors = divisors of math.gcd(a, b)
Always included
1 (unless both are 0)
Largest
gcd(a, b) itself
Classic check
12, 18 → 1, 2, 3, 6
Try it
Live Preview
Enter two integers to see their GCD and every common divisor.
Whole numbers (absolute values used). Tap a chip or type a pair.
Result
a = 12, b = 18
gcd(12, 18) = 6
Common divisors: 1, 2, 3, 6
Count = 4
Trace
Worked Walkthrough — a = 12, b = 18
Check every candidate from 1 through min(12, 18) = 12. Keep only values that divide both.
Calculation
i=1 → 12%1==0 and 18%1==0 → keep
i=2 → 12%2==0 and 18%2==0 → keep
i=3 → 12%3==0 and 18%3==0 → keep
i=4 → 12%4==0 but 18%4!=0 → skip
i=5 → skip
i=6 → 12%6==0 and 18%6==0 → keep
i=7..12 → skip
Common divisors: 1, 2, 3, 6
gcd = 6
Code
Python Programs
Start with the readable loop to min(a, b). Then use math.gcd plus a divisor scan for the cleaner math path.
Example 1 — Simple Loop
Test every integer from 1 to min(a, b) and collect those that divide both.
python
def common_divisors_naive(a: int, b: int) -> list[int]:
a, b = abs(a), abs(b)
if a == 0 and b == 0:
return []
limit = min(a, b)
if limit == 0:
limit = max(a, b)
return [i for i in range(1, limit + 1) if a % i == 0 and b % i == 0]
a, b = 24, 36
result = common_divisors_naive(a, b)
print(f"Common divisors of {a} and {b} are: {', '.join(map(str, result))}")
Output
Common divisors of 24 and 36 are: 1, 2, 3, 4, 6, 12
How It Works
Take absolute values so negative inputs behave like positives.
If both are 0, return an empty list — there is no finite set of common divisors.
Set limit to the smaller magnitude (or the nonzero value if one input is 0).
Keep every i from 1 to limit only when both remainders are 0.
For 24 and 36, the kept values are 1, 2, 3, 4, 6, 12.
Example 2 — GCD Method
Compute math.gcd(a, b), then list every divisor of that GCD.
python
import math
def common_divisors_via_gcd(a: int, b: int) -> list[int]:
a, b = abs(a), abs(b)
if a == 0 and b == 0:
return []
g = math.gcd(a, b)
return [i for i in range(1, g + 1) if g % i == 0]
a, b = -12, 18
result = common_divisors_via_gcd(a, b)
print(f"Common divisors of {a} and {b} are: {', '.join(map(str, result))}")
Output
Common divisors of -12 and 18 are: 1, 2, 3, 6
How It Works
math.gcd uses the Euclidean algorithm under the hood.
For 12 and 18, that yields g = 6 (signs handled via abs).
Every common divisor must divide 6, so it is enough to list divisors of g.
Loop i from 1 to g and keep values where g % i == 0.
Result is sorted automatically: 1, 2, 3, 6.
Edge Cases & Pitfalls
Check these before calling the solution done.
Both 0
No finite list
Reject or return empty. Do not loop forever.
One 0
Use the nonzero value
Common divisors are exactly the divisors of the nonzero number.
Negatives
Take abs()
Positive divisors depend on magnitude, not sign.
Coprime
Only 1
Pairs like 7 and 13 share only 1.
Analysis
Time and Space Complexity
Program
Time
Extra space
Naive loop to min(a, b)
O(min(a, b))
O(1) beyond the answer list
GCD + scan 1…g
O(log min + g)
O(1) beyond the answer list
g is gcd(|a|, |b|). For larger GCDs, walk only to √g and collect factor pairs.
Remember
Key Takeaways
Definition:d divides both a and b.
GCD shortcut: common divisors = all divisors of math.gcd(a, b).
Two loops: naive to min, or scan 1…g after GCD.
Test set:12, 18 → 1 2 3 6; 7, 13 → 1.
One line: values that divide both numbers — or simply every divisor of their GCD.
Frequently Asked Questions
A positive integer d is a common divisor of a and b when a % d == 0 and b % d == 0. For 12 and 18, the common divisors are 1, 2, 3, and 6.
Loop from 1 to min(a, b) and collect values that divide both, or compute math.gcd(a, b) and list the divisors of that gcd.
Every common divisor of a and b divides gcd(a, b), and every divisor of gcd(a, b) is a common divisor. So listing divisors of the gcd is enough.
Yes for any pair that is not both zero. The number 1 divides every integer.
The naive loop is O(min(a, b)). Computing gcd is O(log min), then listing its divisors is O(g) with a simple 1..g scan, or O(sqrt(g)) with factor pairs.