天天看點

醜數的判斷

說法一:把隻包含質因子2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但7、14不是,因為它們包含質因子7。 習慣上我們把1當做是第一個醜數。

前20個醜數為:1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36。

說法二:對于一給定的素數集合 S = {p1, p2, ..., pK},考慮一個正整數集合,該集合中任一進制素的質因數全部屬于S。這個正整數集合包括,p1、p1*p2、p1*p1、p1*p2*p3...(還有其它)。該集合被稱為S集合的“醜數集合”。注意:我們認為1不是一個醜數,醜數集合中每個數從小到大排列,每個醜數都是素數集合中的數的乘積。(如S={2,3,5}時,對應醜數集合為U={2,3,4,5,6,9,10,15,25,30})

1.問題描述

把隻包含質因子2,3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但7、14不是,因為它們包含質因子7。 習慣上我們把1當做是第一個醜數。要求:輸入一個數,判斷是否是醜數或者輸出某一範圍内的所有醜數。

2.解題思路

  • 由于因子隻能是2,3,5這三個特殊數字,是以可以把這三個數字做成清單進行判斷
  • 周遊小于該數的除了1以外的最小因子,判斷其是否在2,3,5之間
  • 若不在内部可以直接輸出其不是醜數
  • 若是2,3,5之一,則可以使用剩下的數,再次判斷其最小因子,直至數變成2,3,5後,可确定其是醜數,循環

3.解題方法

a = [2, 3, 5]

def UglyNumber(m):
    n = m
    while True:
        if n == 1:
            return f'{m}是醜數'
            break
        elif n in a:
            return f'{m}是醜數'
            break
        else:
            b = 0
            for i in a:
                if n % i != 0:
                    b += 1
                else:
                    n /= i
                    continue
            if b == 3:
                return f'{m}不是醜數'
                break


m = int(input('請輸入整數:'))
print(UglyNumber(m))      

第1行: 将三個特殊數字2,3,5建立成一個清單

第3行: 建立醜數函數UglyNumber,并輸入m作為它的變量

第4行: 使用n來替代m的值,n用于變化,m用于表示原數

第6-11行: 判斷n是否為1,2,3,5之間的一個,若是,列印m是完數且結束循環

第12-13行: 若n不是1,2,3,5之間的一個,定義b=0,用處稍後介紹

第14-16行: 使用for循環周遊2,3,5這三個數,判斷2,3,5是否是其因數,若不是,b的值加一

第17-19行: 隻要2,3,5之間有一個數為n的因數,則替換n為n除以因數之後的值,并使用continue結束本次循環,進行下次循環判斷n是否是醜數

第20-22行: 如果b=3,則表示2,3,5之間任何一個數都不是n的因子,則n不是醜數,那麼m也不是醜數

第25-26行: 輸入一個整數并将其值傳回給m,列印其是否是醜數

4.小思考