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
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, 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:
- 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:
// 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;
} |
// 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 );
}
} |
# 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 |
// 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 // 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 ?> |
<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> |
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
// 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 |
// 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;
} |
// 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. |
# 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 |
// 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 |
<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> |
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.