{"id":26733,"date":"2017-12-22T20:37:52","date_gmt":"2017-12-22T15:07:52","guid":{"rendered":"https:\/\/www.wikitechy.com\/technology\/?p=26733"},"modified":"2017-12-22T20:37:52","modified_gmt":"2017-12-22T15:07:52","slug":"python-programming-ugly-numbers","status":"publish","type":"post","link":"https:\/\/www.wikitechy.com\/technology\/python-programming-ugly-numbers\/","title":{"rendered":"Python Programming &#8211; Ugly Numbers"},"content":{"rendered":"<p>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, \u2026 shows the first 11 ugly numbers. By convention, 1 is included.<\/p>\n<p>Given a number n, the task is to find n\u2019th Ugly number.<\/p>\n<pre>Input  : n = 7\r\nOutput : 8\r\n\r\nInput  : n = 10\r\nOutput : 12\r\n\r\nInput  : n = 15\r\nOutput : 24\r\n\r\nInput  : n = 150\r\nOutput : 5832<\/pre>\n<p><center><\/center>&nbsp;<\/p>\n<p><center><strong>Method (Use Dynamic Programming)<\/strong><\/center><br \/>\nHere 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, \u2026<br \/>\nbecause 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:<br \/>\n(1) 1\u00d72, 2\u00d72, 3\u00d72, 4\u00d72, 5\u00d72, \u2026<br \/>\n(2) 1\u00d73, 2\u00d73, 3\u00d73, 4\u00d73, 5\u00d73, \u2026<br \/>\n(3) 1\u00d75, 2\u00d75, 3\u00d75, 4\u00d75, 5\u00d75, \u2026<\/p>\n[ad type=&#8221;banner&#8221;]\n<p>We can find that every subsequence is the ugly-sequence itself (1, 2, 3, 4, 5, \u2026) 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.<\/p>\n<pre>1 Declare an array for ugly numbers:  ugly[n]\r\n2 Initialize first ugly no:  ugly[0] = 1\r\n3 Initialize three array index variables i2, i3, i5 to point to \r\n   1st element of the ugly array: \r\n        i2 = i3 = i5 =0; \r\n4 Initialize 3 choices for the next ugly no:\r\n         next_mulitple_of_2 = ugly[i2]*2;\r\n         next_mulitple_of_3 = ugly[i3]*3\r\n         next_mulitple_of_5 = ugly[i5]*5;\r\n5 Now go in a loop to fill all ugly numbers till 150:\r\nFor (i = 1; i &lt; 150; i++ ) \r\n{\r\n    \/* These small steps are not optimized for good \r\n      readability. Will optimize them in C program *\/\r\n    next_ugly_no  = Min(next_mulitple_of_2,\r\n                        next_mulitple_of_3,\r\n                        next_mulitple_of_5); \r\n    if (next_ugly_no  == next_mulitple_of_2) \r\n    {             \r\n        i2 = i2 + 1;        \r\n        next_mulitple_of_2 = ugly[i2]*2;\r\n    } \r\n    if (next_ugly_no  == next_mulitple_of_3) \r\n    {             \r\n        i3 = i3 + 1;        \r\n        next_mulitple_of_3 = ugly[i3]*3;\r\n     }            \r\n     if (next_ugly_no  == next_mulitple_of_5)\r\n     {    \r\n        i5 = i5 + 1;        \r\n        next_mulitple_of_5 = ugly[i5]*5;\r\n     } \r\n     ugly[i] =  next_ugly_no       \r\n}\/* end of for loop *\/ \r\n6.return next_ugly_no\r\n<\/pre>\n[ad type=&#8221;banner&#8221;]\n<p><strong>Example:<\/strong><br \/>\nLet us see how it works<\/p>\n<pre>initialize\r\n   ugly[] =  | 1 |\r\n   i2 =  i3 = i5 = 0;\r\n\r\nFirst iteration\r\n   ugly[1] = Min(ugly[i2]*2, ugly[i3]*3, ugly[i5]*5)\r\n            = Min(2, 3, 5)\r\n            = 2\r\n   ugly[] =  | 1 | 2 |\r\n   i2 = 1,  i3 = i5 = 0  (i2 got incremented ) \r\n\r\nSecond iteration\r\n    ugly[2] = Min(ugly[i2]*2, ugly[i3]*3, ugly[i5]*5)\r\n             = Min(4, 3, 5)\r\n             = 3\r\n    ugly[] =  | 1 | 2 | 3 |\r\n    i2 = 1,  i3 =  1, i5 = 0  (i3 got incremented ) \r\n\r\nThird iteration\r\n    ugly[3] = Min(ugly[i2]*2, ugly[i3]*3, ugly[i5]*5)\r\n             = Min(4, 6, 5)\r\n             = 4\r\n    ugly[] =  | 1 | 2 | 3 |  4 |\r\n    i2 = 2,  i3 =  1, i5 = 0  (i2 got incremented )\r\n\r\nFourth iteration\r\n    ugly[4] = Min(ugly[i2]*2, ugly[i3]*3, ugly[i5]*5)\r\n              = Min(6, 6, 5)\r\n              = 5\r\n    ugly[] =  | 1 | 2 | 3 |  4 | 5 |\r\n    i2 = 2,  i3 =  1, i5 = 1  (i5 got incremented )\r\n\r\nFifth iteration\r\n    ugly[4] = Min(ugly[i2]*2, ugly[i3]*3, ugly[i5]*5)\r\n              = Min(6, 6, 10)\r\n              = 6\r\n    ugly[] =  | 1 | 2 | 3 |  4 | 5 | 6 |\r\n    i2 = 3,  i3 =  2, i5 = 1  (i2 and i3 got incremented )\r\n\r\nWill continue same way till I &lt; 150<\/pre>\n<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <span class=\"code-embed-name\">Python<\/span> <\/div> <pre class=\"language-python code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-python code-embed-code\"># Python program to find n&#039;th Ugly number<br\/> <br\/># Function to get the nth ugly number<br\/>def getNthUglyNo(n):<br\/> <br\/>    ugly = [0] * n # To store ugly numbers<br\/> <br\/>    # 1 is the first ugly number<br\/>    ugly[0] = 1<br\/> <br\/>    # i2, i3, i5 will indicate indices for 2,3,5 respectively<br\/>    i2 = i3 =i5 = 0<br\/> <br\/>    # set initial multiple value<br\/>    next_multiple_of_2 = 2<br\/>    next_multiple_of_3 = 3<br\/>    next_multiple_of_5 = 5<br\/> <br\/>    # start loop to find value from ugly[1] to ugly[n]<br\/>    for l in range(1, n):<br\/> <br\/>        # choose the min value of all available multiples<br\/>        ugly[l] = min(next_multiple_of_2, next_multiple_of_3, next_multiple_of_5)<br\/> <br\/>        # increment the value of index accordingly<br\/>        if ugly[l] == next_multiple_of_2:<br\/>            i2 += 1<br\/>            next_multiple_of_2 = ugly[i2] * 2<br\/> <br\/>        if ugly[l] == next_multiple_of_3:<br\/>            i3 += 1<br\/>            next_multiple_of_3 = ugly[i3] * 3<br\/> <br\/>        if ugly[l] == next_multiple_of_5: <br\/>            i5 += 1<br\/>            next_multiple_of_5 = ugly[i5] * 5<br\/> <br\/>    # return ugly[n] value<br\/>    return ugly[-1]<br\/> <br\/>def main():<br\/> <br\/>    n = 150<br\/> <br\/>    print getNthUglyNo(n)<br\/> <br\/> <br\/>if __name__ == &#039;__main__&#039;:<br\/>    main()<br\/> <\/code><\/pre> <\/div>\n<p>Output :<\/p>\n<pre>5832\r\n<\/pre>\n<p><strong>Algorithmic Paradigm: <\/strong>Dynamic Programming<br \/>\n<strong>Time Complexity: <\/strong>O(n)<br \/>\n<strong>Auxiliary Space: <\/strong>O(n)<\/p>\n[ad type=&#8221;banner&#8221;]\n","protected":false},"excerpt":{"rendered":"<p>Python Programming &#8211; Ugly Numbers &#8211; Dynamic Programming Ugly numbers are numbers whose only prime factors are 2, 3 or 5.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,70145,4148],"tags":[72847,72842,72845,70483,72848,72840,72846,72994,79785,72843,72992,72854,72844,72850,79786,79791,79788,79790,79789,72839,79793,79784,79792,79794,72852,72855,79783,72853,79782,79787,72851],"class_list":["post-26733","post","type-post","status-publish","format-standard","hentry","category-coding","category-dynamic-programming","category-python","tag-concept-of-dynamic-programming","tag-define-dynamic-programming","tag-definition-of-dynamic-programming","tag-dynamic-programming","tag-dynamic-programming-code-generation-algorithm","tag-dynamic-programming-definition","tag-dynamic-programming-in-data-structure","tag-dynamic-programming-in-python","tag-dynamic-programming-in-python-based-on-ugly-number","tag-dynamic-programming-problems","tag-dynamic-programming-python","tag-dynamic-programming-set-1","tag-dynamic-programming-software","tag-explain-dynamic-programming","tag-find-nth-ugly-number","tag-greatest-divisible-power","tag-hamming","tag-hamming-number-program-in-python","tag-hamming-numbers-algorithm","tag-how-to-solve-dynamic-programming-problems","tag-missing-number","tag-nth-ugly-number","tag-number-formation-in-python","tag-prime-factor","tag-problems-on-dynamic-programming","tag-simple-dynamic-programming-example","tag-super-ugly-number","tag-types-of-dynamic-programming","tag-ugly-numbers","tag-write-a-function-to-find-the-n","tag-youtube-dynamic-programming"],"_links":{"self":[{"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/posts\/26733","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/comments?post=26733"}],"version-history":[{"count":0,"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/posts\/26733\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/media?parent=26733"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/categories?post=26733"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/tags?post=26733"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}