问题描述:给定一个自然数n,由n开始可以依次产生半数集set(n)中的数如下:
(1)set(n)中包含n;
(2)在n的左边加上一个自然数,但该自然数不能超过最近添加的数的一半;
(3)按此规则进行处理,直至不能添加自然数为止。
例如,set(6)={6,16,26,126,36,136}。
编程任务:对于给定的自然数n,编程计算半数集set(n)中元素的个数。
注意:该半数单集是去掉重复项的集合
思路:
#include <iostream>
using namespace std;
int ans[600];
int Comp(int n)
{
int num=1;
if(ans[n]>0)
return ans[n];
for(int i=1;i<=n/2;i++)
{
num+=Comp(i);
if((i>10)&&(2*(i/10)<=i%10))///剔除重复的重数
num-=ans[i/10];///这里是减去
}
ans[n]=num;
return num;
}
int main()
{
int n;
cin>>n;
cout<<Comp(n);
return 0;
}
运行结果如下: