高程題之完數與盈數,簡單桶排序

2021-08-21 11:52:13 字數 967 閱讀 8450

高程有幾道題比較有意思,在這裡記錄一下。

第一題:大概是在2-61之間的數,如果這個數的因數(不包括它本身)之和等於它本身,稱之為完數;若大於它本身,則稱之為盈數。如6=3+2+1, 6是完數。12<6+4+3+2+1, 12是盈數。求2-61之間的完數和盈數。

比較簡單的思維就是,遍歷2-61之間的數,找到每個數的因子,求出來之後跟原數做比較。**這裡就不放了。但是筆者的乙個朋友給出了一種新奇的想法,筆者覺得非常有比較紀念一下。**如下:

a=[1]*61

for i in range(2,31):

j=2*i

while j<=60:

a[j]+=i

j+=i

for i in range(2,61):

if a[i]==i:

print("%d 是完數"%i)

elif a[i]>i:

print("%d 是盈數"%i)

第二題:給一組100以內的數,進行排序。要求時間複雜度為o(n),空間複雜度為o(1)。

分析一下這道題,空間複雜度為o(1),則說明需要是就地排序。時間複雜度為o(n),那麼資料結構書上那些經典的排序演算法就不要想了。不過基數排序倒是有些接近,但也是不可以直接使用的。

桶排序:建立一堆buckets;遍歷原始陣列,並將資料放入到各自的buckets當中;對非空的buckets進行排序; 按照順序遍歷這些buckets並放回到原始陣列中即可構成排序後的陣列。

利用桶排序的思想,可以構造如下演算法:

給出大小為100的陣列,初始化為全0. 當輸入的數與陣列的下標+1相等時,對應下標的值加1. 這樣依次進行。利用陣列中的值來儲存乙個數重複的次數。然後依次遍歷輸出即可。

當然這個演算法,只能針對有限個數,如果是浮點數或者範圍是無限的就無能為力了。但是無妨,鍛鍊思維,增長見識而已。畢!

完數與盈數

乙個數如果恰好等於它的各因子 該數本身除外 子和,如 6 3 2 1,則稱其為 完數 若因子之和大於該數,則稱其為 盈數 求出2 到60 之間所有 完數 和 盈數 並以如下形式輸出 e e1 e2 e3 ei 為完數 g g1 g2 g3 gi 為盈數 無按描述要求輸出 注意e和g後面的冒號之後都有...

完數與盈數

乙個數如果恰好等於它的各個因子 該數本身除外 之和,如 6 3 2 1,那麼稱該數為 完數 若因子之和大於該數,則稱其為 盈數 求出2到60之間的所有完數和盈數。題目沒有任何輸入。輸出2到60之間的所有 完數 和 盈數 並以如下形式輸出 e e1 e2 e3 ei為完數 g g1 g2 g3 gi為...

問題 E 完數與盈數

時間限制 1 sec 記憶體限制 32 mb 提交 73 解決 69 提交 狀態 討論版 命題人 外部匯入 乙個數如果恰好等於它的各因子 該數本身除外 子和,如 6 3 2 1,則稱其為 完數 若因子之和大於該數,則稱其為 盈數 求出2 到60 之間所有 完數 和 盈數 並以如 下形式輸出 e e1...