Swift学习——寻找丑数

前端之家收集整理的这篇文章主要介绍了Swift学习——寻找丑数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

参考自:http://www.cnblogs.com/python27/archive/2011/11/24/2261550.html

题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数。

  分析:寻找一个数是不是满足某种数(质数,水仙数)等,最简单的方法就是遍历,对于任意一个丑数必定可以写成2^m*3^n*5^p,因而对于一个丑数,只含有2,3,5因子,也就意味着该数number%2==0;number%3==0;number%5==0,如果一个数能被2整除,我们就连续除以2;能被3整除,我们就连续除以3;能被5整除,我们就连续除以5;如果最后得到1,则该数是素数,否则是丑数。

  代码如下:

  1. func isUglyNumber(number:Int)->Bool
  2. {
  3. var number1 = number
  4. while number1 % 2 == 0
  5. {
  6. number1 /= 2
  7. }
  8. while number1 % 3 == 0
  9. {
  10. number1 /= 3
  11. }
  12. while number1 % 5 == 0
  13. {
  14. number1 /= 5
  15. }
  16. if number1 == 1
  17. {
  18. return true
  19. }
  20. else{
  21. return false
  22. }
  23. }
  24.  
  25.  
  26. func getUglyNumber1(index:Int)->Int{
  27. if index <= 0{
  28. return 0
  29. }
  30. var number:Int = 0
  31. var count:Int = 0
  32. while(count < index)
  33. {
  34. ++number
  35. if isUglyNumber(number){
  36. ++count
  37. }
  38. }
  39. return number
  40. }

上面计算中主要的不足在于,逐一遍历,这样对于不是丑数的数的判断会造成大量的时间浪费,如果能够根据已经计算好的丑数,计算出下一个丑数就可以避免这种情况,实现从丑数到丑数的高效算法,根据定义可知,后面的丑数肯定是前面已知丑数乘以2,3,5得到的。

  我们假设一个数组中已经有若干丑数,并且这些丑数是按顺序排列的,我们把现有的最大丑数记为max,则下一个丑数肯定是前面丑数乘以2,3,5得到的。不妨考虑乘以2得到的情况,我们把数组中的每一个数都乘以2,由于原数组是有序的,因为乘以2后也是有序递增的,这样必然存在一个数M2,它前面的每一个数都是小于等于max,而包括M2在内的后面的数都是大于max的,因为我们还是要保持递增顺序,所以我们取第一个大于max的数M2。同理对于乘以3的情况,可以取第一个大于max的数M3,对于乘以5的情况,可以取第一个大于max的数M5。

  最终下一个丑数取:min{M2,M3,M5}即可
  (相当于将之前得到的丑数放到一个数组array里,然后分别将数组array里的丑数乘以2,将其与数组array的最后一个丑数b相比,一旦大于b,就称其为上述中的M2,同理可得M3,M5)
  代码如下:
  

  1. func getUglyNumber2(index:Int)->Int{
  2. var uglyNum:Int = 1
  3. if index <= 0{
  4. return 0
  5. }
  6. var uglyArray:Array<Int> = [1]
  7. var m2Array:Array<Int> = Array()
  8. var m3Array:Array<Int> = Array()
  9. var m5Array:Array<Int> = Array()
  10. while uglyArray.count < index{
  11. var m2:Int = 0
  12. var m3:Int = 0
  13. var m5:Int = 0
  14. m2Array = uglyArray
  15. m3Array = uglyArray
  16. m5Array = uglyArray
  17. for (index,value) in enumerate(m2Array){
  18. m2Array[index] = value*2
  19. if m2Array[index] > uglyArray.last{
  20. m2 = m2Array[index]
  21. break
  22. }
  23. }
  24. for (index,value) in enumerate(m3Array){
  25. m3Array[index] = value*3
  26. if m3Array[index] > uglyArray.last{
  27. m3 = m3Array[index]
  28. break
  29. }
  30. }
  31. for (index,value) in enumerate(m5Array){
  32. m5Array[index] = value*5
  33. if m5Array[index] > uglyArray.last{
  34. m5 = m5Array[index]
  35. break
  36. }
  37. }
  38.  
  39. uglyNum = min(m2,m3,m5)
  40. uglyArray.append(uglyNum)
  41. }
  42. return uglyNum
  43. }

在此感谢http://www.cnblogs.com/python27/的每日一算法的分享

猜你在找的Swift相关文章