2630 - 半数单集问 题
时间限制 : 1 秒
内存限制 : 128 MB
给定一个自然数 n,由 n 开始可以依次产生半数集 set(n)中的数如下。
(1) n∈set(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; }