說法一:把隻包含質因子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,列印其是否是醜數