Ugly Numbers
Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, … shows the first 11 ugly numbers. By convention, 1 is included.
Given a number n, the task is to find n’th Ugly number.
Examples:
Input : n = 7 Output : 8 Input : n = 10 Output : 12 Input : n = 15 Output : 24 Input : n = 150 Output : 5832
Method 1 (Simple)
Loop for all positive integers until ugly number count is smaller than n, if an integer is ugly than increment ugly number count.
To check if a number is ugly, divide the number by greatest divisible powers of 2, 3 and 5, if the number becomes 1 then it is an ugly number otherwise not.
For example, let us see how to check for 300 is ugly or not. Greatest divisible power of 2 is 4, after dividing 300 by 4 we get 75. Greatest divisible power of 3 is 3, after dividing 75 by 3 we get 25. Greatest divisible power of 5 is 25, after dividing 25 by 25 we get 1. Since we get 1 finally, 300 is ugly number.
Implementation:
C/C++
// CPP program to find nth ugly number # include<stdio.h> # include<stdlib.h> /*This function divides a by greatest divisible power of b*/ int maxDivide( int a, int b) { while (a%b == 0) a = a/b; return a; } /* Function to check if a number is ugly or not */ int isUgly( int no) { no = maxDivide(no, 2); no = maxDivide(no, 3); no = maxDivide(no, 5); return (no == 1)? 1 : 0; } /* Function to get the nth ugly number*/ int getNthUglyNo( int n) { int i = 1; int count = 1; /* ugly number count */ /*Check for all integers untill ugly count becomes n*/ while (n > count) { i++; if (isUgly(i)) count++; } return i; } /* Driver program to test above functions */ int main() { unsigned no = getNthUglyNo(150); printf ( "150th ugly no. is %d " , no); getchar (); return 0; } |
Java
// Java program to find nth ugly number class GFG { /*This function divides a by greatest divisible power of b*/ static int maxDivide( int a, int b) { while (a % b == 0 ) a = a/b; return a; } /* Function to check if a number is ugly or not */ static int isUgly( int no) { no = maxDivide(no, 2 ); no = maxDivide(no, 3 ); no = maxDivide(no, 5 ); return (no == 1 )? 1 : 0 ; } /* Function to get the nth ugly number*/ static int getNthUglyNo( int n) { int i = 1 ; // ugly number count int count = 1 ; // check for all integers // until count becomes n while (n > count) { i++; if (isUgly(i) == 1 ) count++; } return i; } /* Driver program to test above functions */ public static void main(String args[]) { int no = getNthUglyNo( 150 ); System.out.println( "150th ugly " + "no. is " + no); } } // This code has been contributed by // Amit Khandelwal (Amit Khandelwal 1) |
Python3
# Python3 code to find nth ugly number # This function divides a by greatest # divisible power of b def maxDivide( a, b ): while a % b = = 0 : a = a / b return a # Function to check if a number # is ugly or not def isUgly( no ): no = maxDivide(no, 2 ) no = maxDivide(no, 3 ) no = maxDivide(no, 5 ) return 1 if no = = 1 else 0 # Function to get the nth ugly number def getNthUglyNo( n ): i = 1 count = 1 # ugly number count # Check for all integers untill # ugly count becomes n while n > count: i + = 1 if isUgly(i): count + = 1 return i # Driver code to test above functions no = getNthUglyNo( 150 ) print ( "150th ugly no. is " , no) # This code is contributed by "Sharad_Bhardwaj". |
C#
// C# program to find nth ugly number using System; class GFG { /*This function divides a by greatest divisible power of b*/ static int maxDivide( int a, int b) { while (a % b == 0) a = a / b; return a; } /* Function to check if a number is ugly or not */ static int isUgly( int no) { no = maxDivide(no, 2); no = maxDivide(no, 3); no = maxDivide(no, 5); return (no == 1)? 1 : 0; } /* Function to get the nth ugly number*/ static int getNthUglyNo( int n) { int i = 1; // ugly number count int count = 1; // check for all integers // until count becomes n while (n > count) { i++; if (isUgly(i) == 1) count++; } return i; } // Driver code public static void Main() { int no = getNthUglyNo(150); Console.WriteLine( "150th ugly" + " no. is " + no); } } // This code is contributed by Sam007. |
PHP
<?php // PHP program to find nth ugly number // This function divides a by // greatest divisible power of b function maxDivide( $a , $b ) { while ( $a % $b == 0) $a = $a / $b ; return $a ; } // Function to check if a // number is ugly or not function isUgly( $no ) { $no = maxDivide( $no , 2); $no = maxDivide( $no , 3); $no = maxDivide( $no , 5); return ( $no == 1)? 1 : 0; } // Function to get the nth // ugly number function getNthUglyNo( $n ) { $i = 1; // ugly number count $count = 1; // Check for all integers // untill ugly count becomes n while ( $n > $count ) { $i ++; if (isUgly( $i )) $count ++; } return $i ; } // Driver Code $no = getNthUglyNo(150); echo "150th ugly no. is " . $no ; // This code is contributed by Sam007 ?> |
Output:
150th ugly no. is 5832
This method is not time efficient as it checks for all integers until ugly number count becomes n, but space complexity of this method is O(1)
Method 2 (Use Dynamic Programming)
Here is a time efficient solution with O(n) extra space. The ugly-number sequence is 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, …
because every number can only be divided by 2, 3, 5, one way to look at the sequence is to split the sequence to three groups as below:
(1) 1×2, 2×2, 3×2, 4×2, 5×2, …
(2) 1×3, 2×3, 3×3, 4×3, 5×3, …
(3) 1×5, 2×5, 3×5, 4×5, 5×5, …
We can find that every subsequence is the ugly-sequence itself (1, 2, 3, 4, 5, …) multiply 2, 3, 5. Then we use similar merge method as merge sort, to get every ugly number from the three subsequence. Every step we choose the smallest one, and move one step after.
1 Declare an array for ugly numbers: ugly[n] 2 Initialize first ugly no: ugly[0] = 1 3 Initialize three array index variables i2, i3, i5 to point to 1st element of the ugly array: i2 = i3 = i5 =0; 4 Initialize 3 choices for the next ugly no: next_mulitple_of_2 = ugly[i2]*2; next_mulitple_of_3 = ugly[i3]*3 next_mulitple_of_5 = ugly[i5]*5; 5 Now go in a loop to fill all ugly numbers till 150: For (i = 1; i < 150; i++ ) { /* These small steps are not optimized for good readability. Will optimize them in C program */ next_ugly_no = Min(next_mulitple_of_2, next_mulitple_of_3, next_mulitple_of_5); ugly[i] = next_ugly_no if (next_ugly_no == next_mulitple_of_2) { i2 = i2 + 1; next_mulitple_of_2 = ugly[i2]*2; } if (next_ugly_no == next_mulitple_of_3) { i3 = i3 + 1; next_mulitple_of_3 = ugly[i3]*3; } if (next_ugly_no == next_mulitple_of_5) { i5 = i5 + 1; next_mulitple_of_5 = ugly[i5]*5; } }/* end of for loop */ 6.return next_ugly_no
Example:
Let us see how it works
initialize ugly[] = | 1 | i2 = i3 = i5 = 0; First iteration ugly[1] = Min(ugly[i2]*2, ugly[i3]*3, ugly[i5]*5) = Min(2, 3, 5) = 2 ugly[] = | 1 | 2 | i2 = 1, i3 = i5 = 0 (i2 got incremented ) Second iteration ugly[2] = Min(ugly[i2]*2, ugly[i3]*3, ugly[i5]*5) = Min(4, 3, 5) = 3 ugly[] = | 1 | 2 | 3 | i2 = 1, i3 = 1, i5 = 0 (i3 got incremented ) Third iteration ugly[3] = Min(ugly[i2]*2, ugly[i3]*3, ugly[i5]*5) = Min(4, 6, 5) = 4 ugly[] = | 1 | 2 | 3 | 4 | i2 = 2, i3 = 1, i5 = 0 (i2 got incremented ) Fourth iteration ugly[4] = Min(ugly[i2]*2, ugly[i3]*3, ugly[i5]*5) = Min(6, 6, 5) = 5 ugly[] = | 1 | 2 | 3 | 4 | 5 | i2 = 2, i3 = 1, i5 = 1 (i5 got incremented ) Fifth iteration ugly[4] = Min(ugly[i2]*2, ugly[i3]*3, ugly[i5]*5) = Min(6, 6, 10) = 6 ugly[] = | 1 | 2 | 3 | 4 | 5 | 6 | i2 = 3, i3 = 2, i5 = 1 (i2 and i3 got incremented ) Will continue same way till I < 150
C/C++
// C++ program to find n'th Ugly number # include<bits/stdc++.h> using namespace std; /* Function to get the nth ugly number*/ unsigned getNthUglyNo(unsigned n) { unsigned ugly[n]; // To store ugly numbers unsigned i2 = 0, i3 = 0, i5 = 0; unsigned next_multiple_of_2 = 2; unsigned next_multiple_of_3 = 3; unsigned next_multiple_of_5 = 5; unsigned next_ugly_no = 1; ugly[0] = 1; for ( int i=1; i<n; i++) { next_ugly_no = min(next_multiple_of_2, min(next_multiple_of_3, next_multiple_of_5)); ugly[i] = next_ugly_no; if (next_ugly_no == next_multiple_of_2) { i2 = i2+1; next_multiple_of_2 = ugly[i2]*2; } if (next_ugly_no == next_multiple_of_3) { i3 = i3+1; next_multiple_of_3 = ugly[i3]*3; } if (next_ugly_no == next_multiple_of_5) { i5 = i5+1; next_multiple_of_5 = ugly[i5]*5; } } /*End of for loop (i=1; i<n; i++) */ return next_ugly_no; } /* Driver program to test above functions */ int main() { int n = 150; cout << getNthUglyNo(n); return 0; } |
Java
// Java program to find nth ugly number import java.lang.Math; class UglyNumber { /* Function to get the nth ugly number*/ int getNthUglyNo( int n) { int ugly[] = new int [n]; // To store ugly numbers int i2 = 0 , i3 = 0 , i5 = 0 ; int next_multiple_of_2 = 2 ; int next_multiple_of_3 = 3 ; int next_multiple_of_5 = 5 ; int next_ugly_no = 1 ; ugly[ 0 ] = 1 ; for ( int i = 1 ; i < n; i++) { next_ugly_no = Math.min(next_multiple_of_2, Math.min(next_multiple_of_3, next_multiple_of_5)); ugly[i] = next_ugly_no; if (next_ugly_no == next_multiple_of_2) { i2 = i2+ 1 ; next_multiple_of_2 = ugly[i2]* 2 ; } if (next_ugly_no == next_multiple_of_3) { i3 = i3+ 1 ; next_multiple_of_3 = ugly[i3]* 3 ; } if (next_ugly_no == next_multiple_of_5) { i5 = i5+ 1 ; next_multiple_of_5 = ugly[i5]* 5 ; } } /*End of for loop (i=1; i<n; i++) */ return next_ugly_no; } /* Driver program to test above functions */ public static void main(String args[]) { int n = 150 ; UglyNumber obj = new UglyNumber(); System.out.println(obj.getNthUglyNo(n)); } } // This code has been contributed by Amit Khandelwal (Amit Khandelwal 1) |
Python
# Python program to find n'th Ugly number # Function to get the nth ugly number def getNthUglyNo(n): ugly = [ 0 ] * n # To store ugly numbers # 1 is the first ugly number ugly[ 0 ] = 1 # i2, i3, i5 will indicate indices for 2,3,5 respectively i2 = i3 = i5 = 0 # set initial multiple value next_multiple_of_2 = 2 next_multiple_of_3 = 3 next_multiple_of_5 = 5 # start loop to find value from ugly[1] to ugly[n] for l in range ( 1 , n): # choose the min value of all available multiples ugly[l] = min (next_multiple_of_2, next_multiple_of_3, next_multiple_of_5) # increment the value of index accordingly if ugly[l] = = next_multiple_of_2: i2 + = 1 next_multiple_of_2 = ugly[i2] * 2 if ugly[l] = = next_multiple_of_3: i3 + = 1 next_multiple_of_3 = ugly[i3] * 3 if ugly[l] = = next_multiple_of_5: i5 + = 1 next_multiple_of_5 = ugly[i5] * 5 # return ugly[n] value return ugly[ - 1 ] def main(): n = 150 print getNthUglyNo(n) if __name__ = = '__main__' : main() #This code is contributed by Neelam Yadav |
C#
// C# program to count inversions in an array using System; using System.Collections.Generic; class GFG { /* Function to get the nth ugly number*/ static int getNthUglyNo( int n) { // To store ugly numbers int []ugly = new int [n]; int i2 = 0, i3 = 0, i5 = 0; int next_multiple_of_2 = 2; int next_multiple_of_3 = 3; int next_multiple_of_5 = 5; int next_ugly_no = 1; ugly[0] = 1; for ( int i = 1; i < n; i++) { next_ugly_no = Math.Min(next_multiple_of_2, Math.Min(next_multiple_of_3, next_multiple_of_5)); ugly[i] = next_ugly_no; if (next_ugly_no == next_multiple_of_2) { i2 = i2 + 1; next_multiple_of_2 = ugly[i2] * 2; } if (next_ugly_no == next_multiple_of_3) { i3 = i3 + 1; next_multiple_of_3 = ugly[i3] * 3; } if (next_ugly_no == next_multiple_of_5) { i5 = i5 + 1; next_multiple_of_5 = ugly[i5] * 5; } } return next_ugly_no; } // Driver code public static void Main() { int n = 150; Console.WriteLine(getNthUglyNo(n)); } } // This code is contributed by Sam007 |
PHP
<?php // PHP program to find // n'th Ugly number // Function to get the // nth ugly number function getNthUglyNo( $n ) { // To store ugly numbers $ugly = array_fill (0, $n , 0); $i2 = 0; $i3 = 0; $i5 = 0; $next_multiple_of_2 = 2; $next_multiple_of_3 = 3; $next_multiple_of_5 = 5; $next_ugly_no = 1; $ugly [0] = 1; for ( $i = 1; $i < $n ; $i ++) { $next_ugly_no = min( $next_multiple_of_2 , min( $next_multiple_of_3 , $next_multiple_of_5 )); $ugly [ $i ] = $next_ugly_no ; if ( $next_ugly_no == $next_multiple_of_2 ) { $i2 = $i2 + 1; $next_multiple_of_2 = $ugly [ $i2 ] * 2; } if ( $next_ugly_no == $next_multiple_of_3 ) { $i3 = $i3 + 1; $next_multiple_of_3 = $ugly [ $i3 ] * 3; } if ( $next_ugly_no == $next_multiple_of_5 ) { $i5 = $i5 + 1; $next_multiple_of_5 = $ugly [ $i5 ] * 5; } } /*End of for loop (i=1; i<n; i++) */ return $next_ugly_no ; } // Driver code $n = 150; echo getNthUglyNo( $n ); // This code is contributed by mits ?> |
Output :
5832
Time Complexity: O(n)
Auxiliary Space: O(n)
Super Ugly Number (Number whose prime factors are in given set)
Please write comments if you find any bug in the above program or other ways to solve the same problem.
Recommended Posts:
- Maximum length of a sub-array with ugly numbers
- Sort ugly numbers in an array at their relative positions
- Total distinct pairs of ugly numbers from two arrays
- Super Ugly Number (Number whose prime factors are in given set)
- Print all distinct integers that can be formed by K numbers from a given array of N numbers
- Bitwise AND of the sum of prime numbers and the sum of composite numbers in an array
- Print N lines of 4 numbers such that every pair among 4 numbers has a GCD K
- Numbers less than N which are product of exactly two distinct prime numbers
- Rearrange numbers in an array such that no two adjacent numbers are same
- Given pairwise sum of n numbers, find the numbers
- Count numbers which can be constructed using two numbers
- Count numbers which are divisible by all the numbers from 2 to 10
- Maximum sum of distinct numbers such that LCM of these numbers is N
- Absolute difference between the Product of Non-Prime numbers and Prime numbers of an Array
- Absolute Difference between the Sum of Non-Prime numbers and Prime numbers of an Array