半数单集问题

【问题描述】
给定一个自然数 n,由 n 开始可以依次产生半数集 set(n)中的数如下。n∈set(n);在 n 的
左边加上一个自然数,但该自然数不能超过最近添加的数的一半;按此规则进行处理,直到
不能再添加自然数为止。
例如,set(6)={6,16,26,126,36,136}。半数集 set(6)中有 6 个元素。
注意半数集不是多重集。集合中已经有的元素不再添加到集合中。
对于给定的自然数 n,编程计算半数集 set(n)中的元素个数。

#include <iostream>
#include <string.h>
using namespace std;
int a[100],sum;//sum用来统计总数,数组a存储半数 
char b[20000][100],c[100];//数组b存储之前记录的项 
void tongji(int n, int deepth)
{
	a[deepth]=n;//数组a存储数字n 
	itoa(a[deepth],b[sum],10);//将数组a里面的数字转换为字符串存储到b 
	for(int i=deepth-1;i>=0;i--)//将数组a里面的数字逐个转换为字符串 
	{
		itoa(a[i],c,10);
		strcat(b[sum],c);//连接字符串c到字符串b 
	}	
	int T=1;//判断是否有重复项 
	for(int i=sum-1;i>=0;i--)
		if(strcmp(b[sum],b[i])==0) T=0;//如果有重复项,则设置T为0 
	if(T)//如果没有重复项 
		cout<<b[sum++]<<endl;//输出项目,并且总数加1 
	for(int i=1;i<=n/2;i++)//循环 
		tongji(i,deepth+1);//i为半数,再次递归下一位数字
}
int main()
{
	int n;
	while(cin>>n)
	{
		sum=0;//设sum为0 
		tongji(n,0);//运行统计函数 
		cout<<"半数单集个数为"<<sum<<"个"<<endl;//输出个数 
	}
		 
}

 输入

26

输出

26
126
226
1226
326
1326
426
1426
2426
12426
526
1526
2526
12526
626
1626
2626
12626
3626
13626
726
1726
2726
12726
3726
13726
826
1826
2826
12826
3826
13826
4826
14826
24826
124826
926
1926
2926
12926
3926
13926
4926
14926
24926
124926
1026
11026
21026
121026
31026
131026
41026
141026
241026
1241026
51026
151026
251026
1251026
1126
11126
21126
121126
31126
131126
41126
141126
241126
1241126
51126
151126
251126
1251126
11226
21226
121226
31226
131226
41226
141226
241226
1241226
51226
151226
251226
1251226
61226
161226
261226
1261226
361226
1361226
11326
21326
121326
31326
131326
41326
141326
241326
1241326
51326
151326
251326
1251326
61326
161326
261326
1261326
361326
1361326
半数单集个数为112个

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值