半數單集問題

問題詳情

給定一個自然數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

總結

半數單集問題是半數集的去重集合。具體實現方法並不難。

發佈了45 篇原創文章 · 獲贊 8 · 訪問量 9906
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章