Open In App

Find all factors of a Natural Number in sorted order

Improve
Improve
Like Article
Like
Save
Share
Report

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 
Recommended Practice

We strongly recommend referring to the below article as a prerequisite. 
Find all divisors of a natural number | Set 1
In the above post, we found a way to find all the divisors in O(sqrt(n)).
However there is still a minor problem with the solution, can you guess? 
Yes! the output is not in a sorted fashion which we had got using the brute-force technique.

How to print the output in sorted order? 
If we observe the output which we had got, we can analyze that the divisors are printed in a zig-zag fashion (small, large pairs). Hence, if we store half of them, we can print them in sorted order. 

Learn More, Natural Number

Algorithm:

  •  Define a method named “printDivisors” with a void return type that takes an integer value as an input variable.
  •  Initialize a Vector “v” to store half of the divisors.
  • Start a for loop and iterate through all the numbers from 1 to the square root of “n”.
    • now, inside the loop Check if the remainder of “n” divided by the current iteration variable “i” is 0. If true, then proceed to the next step:
      • Check if the divisors are equal by comparing “n/i” and “i”. If equal, then print the divisor “i”
      •  Otherwise, print the divisor “i” and add “n/i” to the vector “v”.
  •  Now start another for loop and iterate through the vector “v” in reverse order and print each element. 

Below is an implementation for the same: 

C++




// A O(sqrt(n)) program that prints all divisors
// in sorted order
#include <bits/stdc++.h>
using namespace std;
  
// function to print the divisors
void printDivisors(int n)
{
    // Vector to store half of the divisors
    vector<int> v;
    for (int i = 1; i <= sqrt(n); i++) {
        if (n % i == 0) {
  
            // check if divisors are equal
            if (n / i == i)
                printf("%d ", i);
            else {
                printf("%d ", i);
  
                // push the second divisor in the vector
                v.push_back(n / i);
            }
        }
    }
  
    // The vector will be printed in reverse
    for (int i = v.size() - 1; i >= 0; i--)
        printf("%d ", v[i]);
}
  
/* Driver program to test above function */
int main()
{
    printf("The divisors of 100 are: \n");
    printDivisors(100);
    return 0;
}


Java




// A O(sqrt(n)) java program that prints all divisors
// in sorted order
  
import java.util.Vector;
  
class Test {
    // method to print the divisors
    static void printDivisors(int n)
    {
        // Vector to store half of the divisors
        Vector<Integer> v = new Vector<>();
        for (int i = 1; i <= Math.sqrt(n); i++) {
            if (n % i == 0) {
  
                // check if divisors are equal
                if (n / i == i)
                    System.out.printf("%d ", i);
                else {
                    System.out.printf("%d ", i);
  
                    // push the second divisor in the vector
                    v.add(n / i);
                }
            }
        }
  
        // The vector will be printed in reverse
        for (int i = v.size() - 1; i >= 0; i--)
            System.out.printf("%d ", v.get(i));
    }
  
    // Driver method
    public static void main(String args[])
    {
        System.out.println("The divisors of 100 are: ");
        printDivisors(100);
    }
}


Python3




# A O(sqrt(n)) java program that prints
# all divisors in sorted order
import math
  
# Method to print the divisors
  
  
def printDivisors(n):
    list = []
  
    # List to store half of the divisors
    for i in range(1, int(math.sqrt(n) + 1)):
  
        if (n % i == 0):
  
            # Check if divisors are equal
            if (n / i == i):
                print(i, end=" ")
            else:
                # Otherwise print both
                print(i, end=" ")
                list.append(int(n / i))
  
    # The list will be printed in reverse
    for i in list[::-1]:
        print(i, end=" ")
  
  
# Driver method
print("The divisors of 100 are: ")
printDivisors(100)
  
# This code is contributed by Gitanjali


C#




// A O(sqrt(n)) C# program that
// prints all divisors in sorted order
using System;
  
class GFG {
  
    // method to print the divisors
    static void printDivisors(int n)
    {
        // Vector to store half
        // of the divisors
        int[] v = new int[n];
        int t = 0;
        for (int i = 1; i <= Math.Sqrt(n); i++) {
            if (n % i == 0) {
  
                // check if divisors are equal
                if (n / i == i)
                    Console.Write(i + " ");
                else {
                    Console.Write(i + " ");
  
                    // push the second divisor
                    // in the vector
                    v[t++] = n / i;
                }
            }
        }
  
        // The vector will be
        // printed in reverse
        for (int i = t - 1; i >= 0; i--)
            Console.Write(v[i] + " ");
    }
  
    // Driver Code
    public static void Main()
    {
        Console.Write("The divisors of 100 are: \n");
        printDivisors(100);
    }
}
  
// This code is contributed
// by ChitraNayal


PHP




<?php
// A O(sqrt(n)) program that 
// prints all divisors in
// sorted order
  
// function to print
// the divisors
function printDivisors($n)
{
    // Vector to store half
    // of the divisors
    $v;
    $t = 0;
    for ($i = 1; 
         $i <= (int)sqrt($n); $i++)
    {
        if ($n % $i == 0)
        {
            // check if divisors are equal
            if ((int)$n / $i == $i
                echo $i . " ";
            else
            {
                echo $i . " ";
  
                // push the second 
                // divisor in the vector
                $v[$t++] = (int)$n / $i;
            }
        }
    }
  
    // The vector will be
    // printed in reverse
    for ($i = count($v) - 1; 
         $i >= 0; $i--)
        echo $v[$i] . " ";
}
  
// Driver code
echo "The divisors of 100 are: \n";
printDivisors(100);
  
// This code is contributed by mits
?>


Javascript




<script>
  
// A O(sqrt(n)) program that 
// prints all divisors in
// sorted order
  
// function to print
// the divisors
function printDivisors(n)
{
    // Vector to store half
    // of the divisors
    let v = [];
    let t = 0;
    for (let i = 1; 
         i <= parseInt(Math.sqrt(n)); i++)
    {
        if (n % i == 0)
        {
            // check if divisors are equal
            if (parseInt(n / i) == i) 
                document.write(i + " ");
            else
            {
                document.write(i + " ");
  
                // push the second 
                // divisor in the vector
                v[t++] = parseInt(n / i);
            }
        }
    }
  
    // The vector will be
    // printed in reverse
    for (let i = v.length - 1; 
         i >= 0; i--){
         document.write(v[i] + " ");
    }
}
  
// Driver code
document.write("The divisors of 100 are: \n");
printDivisors(100);
  
// This code is contributed by _saurabh_jaiswal
  
</script>


Output

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

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

Method 2 :

Approach: In the below approach using for loop we are first printing the numbers only which gives the remainder as 0 and once we break the loop we are just printing the quotient of numbers which gives the remainder as 0.

Let’s understand through an example : 

n = 10 
from 1 to 10
keep checking n % 1 == 0 print 1
              n % 2 == 0 print 2
              3, 4, 5, 6, 7, 8, 9 will not give remainder 0 
              exit loop;
              
The 1 and 2 which gives remainder as 0 it also mean that n is perfectly divisible by 1 and 2 so in second for loop keep printing the quotient on dividing by 1 and 2 which left remainder 0
from 10 to 1 
keep checking n % 1 == 0 print n/1 
              n % 2 == 0 print n/2   
              exit loop

C++




// A O(sqrt(n)) program that prints all divisors
// in sorted order
#include <iostream>
#include <math.h>
using namespace std;
  
// Function to print the divisors
void printDivisors(int n)
{
    int i;
    for (i = 1; i * i < n; i++) {
        if (n % i == 0)
            cout<<i<<" ";
    }
    if (i - (n / i) == 1) {
        i--;
    }
    for (; i >= 1; i--) {
        if (n % i == 0)
            cout<<n / i<<" ";
    }
}
  
// Driver code
int main()
{
    cout << "The divisors of 100 are: \n";
  
    printDivisors(100);
  
    return 0;
}
  
// This code is contributed by siteshbiswal


C




// A O(sqrt(n)) program that prints all divisors
// in sorted order
#include <stdio.h>
#include <math.h>
  
// function to print the divisors
void printDivisors(int n)
{ int i;
    for ( i = 1; i*i < n; i++) {
        if (n % i == 0)
            printf("%d ", i);
    }
   if(i-(n/i)==1)
    {
      i--;
    }
    for (; i >= 1; i--) {
        if (n % i == 0)
            printf("%d ", n / i);
    }
}
  
/* Driver program to test above function */
int main()
{
    printf("The divisors of 100 are: \n");
    printDivisors(100);
    return 0;
}


Java




// A O(sqrt(n)) program that prints all
// divisors in sorted order 
import java.lang.Math; 
  
class GFG{
      
// Function to print the divisors 
public static void printDivisors(int n) 
{ int i;
    for( i = 1; i * i < n; i++)
    
        if (n % i == 0)
            System.out.print(i + " ");
    
    if(i-(n/i)==1)
    {
      i--;
    }
    for(; i >= 1; i--)
    
        if (n % i == 0
            System.out.print(n / i + " ");
    
  
// Driver code
public static void main(String[] args) 
{
    System.out.println("The divisors of 100 are: ");
      
    printDivisors(100); 
}
}
  
// This code is contributed by Prakash Veer Singh Tomar.


Python3




# A O(sqrt(n)) program that prints all divisors 
# in sorted order
from math import *
  
# Function to print the divisors
def printDivisors (n):
  
    i = 1
    while (i * i < n):
        if (n % i == 0):
            print(i, end = " ")
  
        i += 1
  
    for i in range(int(sqrt(n)), 0, -1):
        if (n % i == 0):
            print(n // i, end = " ")
  
# Driver Code
print("The divisors of 100 are: ")
  
printDivisors(100)
  
# This code is contributed by himanshu77


C#




// A O(sqrt(n)) program that prints
// all divisors in sorted order
using System;
using System.Collections; 
using System.Collections.Generic; 
  
class GFG{
  
// Function to print the divisors 
static void printDivisors(int n) 
    for(int i = 1; i * i < n; i++)
    
        if (n % i == 0) 
            Console.Write(i + " "); 
    
    for(int i = (int)Math.Sqrt(n); i >= 1; i--)
    
        if (n % i == 0) 
            Console.Write(n / i + " "); 
    
}  
   
// Driver code   
public static void Main(string []arg)
{
    Console.Write("The divisors of 100 are: \n"); 
      
    printDivisors(100); 
}
}
  
// This code is contributed by rutvik_56


Javascript




<script>
  
// A O(sqrt(n)) program that prints all divisors
// in sorted order
  
// function to print the divisors
function printDivisors(n)
{
    for (var i = 1; i*i < n; i++) {
        if (n % i == 0)
            document.write(i + " ");
    }
    for (var i = Math.sqrt(n); i >= 1; i--) {
        if (n % i == 0)
            document.write(" " + n / i);
    }
}
  
// Driver program to test above function
  
    document.write("The divisors of 100 are: \n");
    printDivisors(100);
      
// This code is contributed by simranarora5sos 
  
</script>


Output

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

Time complexity : O(sqrt(n)) 
Auxiliary Space : O(1) 
Thanks to Mysterious Mind for suggesting the above solution.

The if condition between the two loops is used when corner factors in the loop’s condition have a difference of 1(for example- factors of 30 (5,6) here, 5 will be printed two times; to resolve that issue this step is required.



Last Updated : 13 Dec, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads