/*
给定一个自然数n,由n开始依次产生半数集set(n).set(n)的定义如下:
(1) n是set(n)中的元素
(2) 在n的左边添加一个自然数,但该自然数不能超过最近添加的数的一半
(3) 按此规律添加,知道不能添加自然数为止。
例如:set(6)={6,16,26,126,36,136}
上面的都是扯淡:
输出的第一个数是作为个位上的数,剩下的十位百位等位数。十位的数不能大于个位数的一半,百位的数不能大于十位的数。
*/
#include<iostream>
using namespace std;
int half_set(int n)
{
int ans=1;
if(n>1)
{
for(int i=1;i<=n/2;i++)
ans = ans + half_set(i);
}
return ans;
}
int main()
{
int n;
while(cin>>n)
{
cout<<half_set(n)<<endl;
}
return 0;
给定一个自然数n,由n开始依次产生半数集set(n).set(n)的定义如下:
(1) n是set(n)中的元素
(2) 在n的左边添加一个自然数,但该自然数不能超过最近添加的数的一半
(3) 按此规律添加,知道不能添加自然数为止。
例如:set(6)={6,16,26,126,36,136}
上面的都是扯淡:
输出的第一个数是作为个位上的数,剩下的十位百位等位数。十位的数不能大于个位数的一半,百位的数不能大于十位的数。
*/
#include<iostream>
using namespace std;
int half_set(int n)
{
int ans=1;
if(n>1)
{
for(int i=1;i<=n/2;i++)
ans = ans + half_set(i);
}
return ans;
}
int main()
{
int n;
while(cin>>n)
{
cout<<half_set(n)<<endl;
}
return 0;
}
使用数组的方式
#include<iostream>
#include<string.h>
using namespace std;
const int N=1100;
int shu[N];
int half_set(int n)
{
int ans = 1;
if(shu[n]) //因为主函数将数组赋初值0,所以在计算时,不会执行,只有在查找时才会执行
return shu[n];
for(int i=1;i<=n/2;i++)
ans =ans +half_set(i);
shu[n] = ans;
return ans;
}
int main()
{
int n;
while(cin>>n)
{
memset(shu,0,sizeof(shu));
shu[1]=1;
cout<<half_set(n)<<endl;
}
}