問題詳情
給定一個自然數n,由n開始可以依次產生半數集
述:給定一個自然數n,由n開始可以依次產生半數集set(n)中的數如下:
(1)set(n)中包含n;
(2)在n的左邊加上一個自然數,但該自然數不能超過最近添加的數的一半;
(3)按此規則進行處理,直至不能添加自然數爲止。
例如,set(6)={6,16,26,126,36,136}。
編程任務:對於給定的自然數n,編程計算半數集set(n)中元素的個數。
預期輸入
由input.txt文件提供,給出數據n
預期輸出
程序運行結束時,將計算結果輸出到文件output.txt,輸出文件只有一行給出半數集set(n)中的元素個數
分析
需要注意的是該半數單集是去掉重複項的集合
所以要對重複元素進行剔除。
而且集合中的元素個數顯然符合如下的遞歸關係:
set(n) = 1+Σ(set(i)) 1=< i <=n/2
所以依次有源代碼如下
源代碼
# 半數集問題
def set(n):
sum = 1
if list1[n] > 0:
list1[n] = sum
for i in range(n // 2):
sum += set(i)
list1[n] = sum
return sum
with open("input3.txt", mode='r') as f1:
num = int(f1.read().split(' ')[0])
list1 = [0 for i in range(num + 1)]
with open("output3.txt",mode='w+') as f:
print(set(num)+1, file=f)
輸入輸出示例
input3.txt
6
output3.txt
6
總結
半數單集問題是半數集的去重集合。具體實現方法並不難。