高程有幾道題比較有意思,在這裡記錄一下。
第一題:大概是在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...