求序列中第k小的數 Python解題記錄第14題

2021-10-11 18:18:12 字數 3389 閱讀 8912

【本文結構】

題目答案:簡要分析,程式**(測試執行通過,含注釋),執行結果

霍霍磨刀:解答這道題目之前應掌握的知識基礎

解析過程:題目型別,分析以及實踐過程

斬獲成果:通過解答這道題目之後的知識提公升

【題目資訊】

序號:14

描述:將乙個正整數分解質因數。例如:輸入90,列印出90=2*3*3*5

【題目答案】

程式分析:

對n進行分解質因數,應先找到乙個最小的質數k,然後按下述步驟完成:

(1)如果這個質數恰等於n,則說明分解質因數的過程已經結束,列印出即可。

(2)如果n<>k,但n能被k整除,則應列印出k的值,並用n除以k的商,作為新的正整數你n,重複執行第一步。

(3)如果n不能被k整除,則用k+1作為k的值,重複執行第一步。

程式**:

def reducenum(n): # 定義乙個自定義函式

print('{} = '.format(n),end="") # 輸出n值

if not isinstance(n, int) or n <= 0 : # 判斷n的型別是否為int型別,也就是是否是整型,或者是不是小於0

print('請輸入乙個正確的數字 !') # 輸出提示

exit(0) # 退出程式

elif n in [1] : # 或者判斷是否是為1

print('{}'.format(n),end="") # 如果為1,那麼1=1

while n not in [1] : # 迴圈判斷不為1

for index in range(2, n + 1) : # 迴圈比它小的數

if n % index == 0: # 先找到乙個最小的質數

n //= index # n 等於 n/index

if n == 1: # 如果n等於1

print(index) # 輸出index

else : # 否則

print('{} * '.format(index),end="") # 輸出等式右邊的值

break # 跳出迴圈

reducenum(90) # 函式呼叫,輸入引數90

reducenum(100) # 函式呼叫,輸入引數100

執行結果:

90 = 2 * 3 * 3 * 5

100 = 2 * 2 * 5 * 5

【霍霍磨刀】

在解答這道題目之前,你首先應具備以下知識基礎:

了解什麼是質因數

掌握基本的for迴圈,while迴圈,以及if判斷

【解析過程】

題型:第一步:什麼是質因數?並舉例說明

每個合數都可以寫成幾個質數相乘的形式,其中每個質數都是這個合數的因數,把乙個合數用質因數相乘的形式表示出來,叫做分解質因數。如30=2×3×5 .

舉例:1沒有質因子。

5只有1個質因子,5本身。(5是質數。)

6的質因子是2和3。(6 = 2 × 3)

2、4、8、16等只有1個質因子:2(2是質數,4 =2²,8 = 2³,如此類推。)

10有2個質因子:2和5。(10 = 2 × 5)

第二步:用程式來舉例說明

因為1沒有質因數,所以輸入的數必然是2以上,以90為判斷,依次除以1,2,3,4,5,6,7,…

90除以2=45,所以2是90的質因數,商為45

45除以2,餘數不為0,45除以3,餘數為0,因此3是90的質因數,商為15

15除以2,餘數不為0,15除以3,餘數為0,因此3是90的質因數,商為5

5除以2,3,4,餘數均不為0 ,除以5,餘數為0,因此5是90的質因數,商為1

因此90的質因數為2,3,3,5

用程式來演示:

n=int(input("請輸入乙個正整數:")) # 提示輸入資訊

k=1 # 定義變數k,用來逐步輸出每個質因數的序號

while n>1: # 當n值大於1的時候執行下去

for i in range(2,n+1): # 迴圈2到n之間的值

if n % i==0: # 如果取余為0

print("第{}個質因數:{}".format(k,i)) # 則輸出

k=k+1 # k自增1

n=n//i # 同時把n整除i的結果賦值給n

print("剩餘的數:", n) # 輸出整除之後的n

break # 跳出for迴圈

else: # 否則

print(n) # 輸出n

執行結果:

請輸入乙個正整數:90

第1個質因數:2

剩餘的數: 45

第2個質因數:3

剩餘的數: 15

第3個質因數:3

剩餘的數: 5

第4個質因數:5

剩餘的數: 1

第三步:給出我的答案

n = int(input("請輸入乙個正整數:")) # 提示輸入資訊

print("{}=".format(n),end="") # 輸出n值

nlist= # 定義乙個列表

while n > 1: # 當n值大於1的時候執行下去

for i in range(2, n + 1): # 迴圈2到n之間的值

if n % i == 0: # 如果取余為0

n = n // i # 同時把n整除i的結果賦值給n

break # 跳出for迴圈

# join() 方法用於將序列中的元素(必須是str)以指定的字元 連線生成乙個新的字串

print(" * ".join(str(i) for i in nlist)) # 輸出結果

執行結果:

請輸入乙個正整數:90

90=2 * 3 * 3 * 5

為什麼**給得答案比我給的答案行數多,是因為它是自定義函式,考慮到了程式的健壯性,也就是我們不能相信使用者輸入的任何字元,要對字元進行驗證檢查

在**給出的自定義函式中

首先是對輸入的值進行了是否是整數,是否小於0的驗證

其次是對輸入的值進行了是否等於1的驗證

最後才是對輸入的值進行了求質因數的操作

【斬獲成果】

通過本題的解答,我們學習了如何判斷乙個數是否為整型,且是否大於0,進而判斷是否為正整數的方法

舉一反三,丟擲問題:

1.輸入乙個正整數,求最大公倍數

2.輸入乙個正整數,求最小公約數

3. 輸入乙個正整數,先計算出它下面的質數,再迴圈質數去判斷,是否也是一種解答的可能性

【下一題預告】

序號:15

描述:利用條件運算子的巢狀來完成此題:學習成績》=90分的同學用a表示,60-89分之間的用b表示,60分以下的用c表示

求序列中第k小的數 Python解題記錄第14題

本文結構 題目答案 簡要分析,程式 測試執行通過,含注釋 執行結果 霍霍磨刀 解答這道題目之前應掌握的知識基礎 解析過程 題目型別,分析以及實踐過程 斬獲成果 通過解答這道題目之後的知識提公升 題目資訊 序號 14 描述 將乙個正整數分解質因數。例如 輸入90,列印出90 2 3 3 5 題目答案 ...

BFPTR演算法(求序列中第k小的數)

1973 年,blum floyd pratt rivest tarjan一起發布了一篇名為 time bounds for selection 的 給出了一種在陣列中選出第k大元素平均複雜度為o n 的演算法,俗稱 中位數之中位數演算法 其思想是基於對快速排序劃分過程pivot的值得優化,bfpt...

C 求無序序列中第k小的元素

c 求無序序列中第k小的元素 利用優先佇列 priority queue 求出乙個無序整數列中第k小的元素 先輸入序列長度 再輸入該整數列 最後輸入第k小元素位置 k 實驗例子 5 序列長度 2 4 3 6 5 該整數列 2 第k小元素位置 3 輸出結果 如下 include include usi...