题目描述
我们要求找出具有下列性质数的个数(包含输入的自然数n):
先输入一个自然数n(n≤1000),然后对此自然数按照如下方法进行处理:
1.不作任何处理;
2.在它的左边加上一个自然数,但该自然数不能超过原数的一半;
3.加上数后,继续按此规则进行处理,直到不能再加自然数为止.
输入格式
1个自然数n(n≤1000)
输出格式
1个整数,表示具有该性质数的个数。
输入输出样例
输入
6
输出
6
说明/提示
满足条件的数为
6,16,26,126,36,136
解析:仔细想想的话,发现这个其实算是一个规律题,以4为例子
符合的数为4,14,24124
我们可以发现
f[0]=1
f[1]=f[0];
f[2]=f[1]+f[1]=2;
f[3]=f[2]=2;
f[4]=f[3]+f[2]=4;
f[5]=f[4]=4;
从上面我们可以的出,相邻的两个数的满足条件的个数是相同的,且每个偶数数的满足条件的个数为其前面一个数的答案与其整除2之后的答案的和。
所以根据这个规律得:
#include <iostream>
using namespace std;
int rs[1001];
int main()
{
rs[0] = rs[1] = 1;
int n;
cin>>n;
for(int i=2;i<=n;i++){
if(i%2==0){
rs[i]=rs[i-1]+rs[i/2];
}else{
rs[i] = rs[i-1];
}
}
cout<<rs[n]<<endl;
return 0;
}