2630 - 半数单集问 题

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

给定一个自然数 n,由 n 开始可以依次产生半数集 set(n)中的数如下。

(1) nset(n)

(2) n 的左边加上一个自然数,但该自然数不能超过最近添加的数的一半;

(3) 按此规则进行处理,直到不能再添加自然数为止。

例如,set(6)={6,16,26,126,36,136}。半数集 set(6)中有 6 个元素。

注意半数集不是多重集。集合中已经有的元素不再添加到集合中。

题目输入

每个文件只有 n 行,每行给出一个整数 n,直到读到0表示数据读入结束(0<n<=200) 

题目输出

输出n行,给出半数集 set(n)中的元素个数。 

输入/输出样例

输入格式

6
7
0

输出格式

6
6

C++解答

#include<iostream>
#include<iomanip>
using namespace std;
int A[25]; //用于保存选了哪些元素
int n,amount;
void Print(int len){
    for(int i=len-1;i>=0;i--) cout<<A[i]<<' ';
    cout<<endl;
}
void Generate(int i, int m){ //i为当前最前的数字,m为数字串的长度
    //不作任何处理;
    amount++; //Print(m);
    //加数
    for(int a=1;a<=i/2;a++){
        A[m]=a;
        Generate(a,m+1);
    }
}
int main(){
    while(true){
    cin>>n; if(n==0) break;
    A[0]=n; amount=0;
    Generate(n,1);
    cout<<amount<<endl;
    }
    return 0;
}