Find all divisors of a natural number | Set 1

Given a natural number n, print all distinct divisors of it.

Examples:

``` Input : n = 10
Output: 1 2 5 10

Input:  n = 100
Output: 1 2 4 5 10 20 25 50 100

Input:  n = 125
Output: 1 5 25 125
```

Note that this problem is different from finding all prime factors.

Recommended: Please solve it on “PRACTICE ” first, before moving on to the solution.

A Naive Solution would be to iterate all the numbers from 1 to n, checking if that number divides n and printing it. Below is program for the same:

C/C++

```// C++ implementation of Naive method to print all
// divisors
#include <bits/stdc++.h>

// function to print the divisors
void printDivisors(int n)
{
for (int i=1;i<=n;i++)
if (n%i==0)
printf("%d ",i);
}

/* Driver program to test above function */
int main()
{
printf("The divisors of 100 are: n");
printDivisors(100);
return 0;
}
```

Java

```// Java implementation of Naive method to print all
// divisors

class Test
{
// method to print the divisors
static void printDivisors(int n)
{
for (int i=1;i<=n;i++)
if (n%i==0)
System.out.printf("%d ",i);
}

// Driver method
public static void main(String args[])
{
System.out.println("The divisors of 100 are: ");
printDivisors(100);;
}
}
```

Python

```# Python implementation of Naive method
# to print all divisors

# method to print the divisors
def printDivisors(n) :
i = 1
while i <= n :
if (n % i==0) :
print i,
i = i + 1

# Driver method
print "The divisors of 100 are: "
printDivisors(100)

#This code is contributed by Nikita Tiwari.
```

Output :
```The divisors of 100 are:
1 2 4 5 10 20 25 50 100```

Time Complexity : O(n)
Auxiliary Space : O(1)

Can we improve the above solution?
If we look carefully, all the divisors are present in pairs. For example if n = 100, then the various pairs of divisors are: (1,100), (2,50), (4,25), (5,20), (10,10)

Using this fact we could speed up our program significantly.
We, however have to careful if there are two equal divisors as in case of (10, 10). In such case we’d print only one of them.

Below is a implementation for the same:

C/C++

```// A Better (than Naive) Solution to find all divisiors
#include <bits/stdc++.h>

// Function to print the divisors
void printDivisors(int n)
{
// Note that this loop runs till square root
for (int i=1; i<=sqrt(n)+1; i++)
{
if (n%i==0)
{
// If divisors are equal, print only one
if (n/i == i)
printf("%d ", i);

else // Otherwise print both
printf("%d %d ", i, n/i);
}
}
}

/* Driver program to test above function */
int main()
{
printf("The divisors of 100 are: n");
printDivisors(100);
return 0;
}
```

Java

```// A Better (than Naive) Solution to find all divisiors

class Test
{
// method to print the divisors
static void printDivisors(int n)
{
// Note that this loop runs till square root
for (int i=1; i<=Math.sqrt(n)+1; i++)
{
if (n%i==0)
{
// If divisors are equal, print only one
if (n/i == i)
System.out.printf("%d ", i);

else // Otherwise print both
System.out.printf("%d %d ", i, n/i);
}
}
}

// Driver method
public static void main(String args[])
{
System.out.println("The divisors of 100 are: ");
printDivisors(100);;
}
}
```

Python

```# A Better (than Naive) Solution to find all divisiors
import math

# method to print the divisors
def printDivisors(n) :

# Note that this loop runs till square root
i = 1
while i <= math.sqrt(n) + 1 :

if (n % i == 0) :

# If divisors are equal, print only one
if (n / i == i) :
print i,
else :
# Otherwise print both
print i , n/i,
i = i + 1

# Driver method
print "The divisors of 100 are: "
printDivisors(100)

#This code is contributed by Nikita Tiwari.
```

Output :
```The divisors of 100 are:
1 100 2 50 4 25 5 20 10```

Time Complexity : O(sqrt(n))
Auxiliary Space : O(1)

However there is still a minor problem in the solution, can you guess?
Yes! the output is not in a sorted fashion which we had got using brute-force technique. Please refer below for a O(sqrt(n)) time solution that prints divisors in sorted order.

Find all divisors of a natural number | Set 2

GATE CS Corner    Company Wise Coding Practice

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.
1.4 Average Difficulty : 1.4/5.0
Based on 24 vote(s)