半数集定义:
- 给定一个自然数n,由n开始可以依次产生半数集set(n)中的数如下:
- 在n的左边加上一个自然数,但该自然数不能超过最近添加的数的一半;
- 按此规则进行处理,直到不能再添加自然数为止。
举例:
以自然数6为例,首先包括其本身{6},然后包括6与其约数构成的2位数集合{16,26,36},最后还有两个3位数集合{126,136}。
汇总之后得出6的半数集set(6)={6,16,26,36,126,136}.
对set(6)分析:
- 6 不做处理
- 16 在6左面添加1,1前面没有数可以添加
- 26 在6前面加2 ,继续进行操作
- 126 在2前面加1,1前面没有数添加
- 36 在6前面添加3,继续进行操作
- 136 在3前面添加1,1前面没有数可以添加
实现效率低(重复子问题):
#include <iostream>
using namespace std;
int comp(int n) {
int ans=1; //n的半数集合的大小,n属于这个集合,因此初值为1
for(i=1;i<=n/2;i++) { //i为新数的前面的部分数字,注意要求是不超过
ans=ans+ comp(i);
}
return ans;
}
int main() {
int x,n