问题详情
给定一个自然数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
总结
半数单集问题是半数集的去重集合。具体实现方法并不难。