Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 19 Accepted Submission(s) : 8
Problem Description
我们要求找出具有下列性质数的个数(包括输入的自然数n)。先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理:
1.不作任何处理;
2.在它的左边加上一个自然数,但该自然数不能超过原数的一半;
加上数后,继续按此规则进行处理,直到不能再加自然数为止。
1.不作任何处理;
2.在它的左边加上一个自然数,但该自然数不能超过原数的一半;
加上数后,继续按此规则进行处理,直到不能再加自然数为止。
Input
输入有多组数据,每组数据为自然数n。
Output
对于每组数据输出满足条件的数的个数。
Sample Input
6
Sample Output
6
Hint
满足条件的数为6,16,26,126,36,136。
题目分析: 用a[n]记录n满足的条件的个数,根据前十组数据
n a[n]
0 1
1 1
2 2
3 2
4 4
5 4
6 6
7 6
8 10
9 10
10 14
根据数据可得 a[n] = a[n/2] + a[n/2 - 1] + a[n/2 - 2] +...a[1] + 1; 又 a[n-2] = a[n/2 - 1]+a[n/2 - 2]+...a[1]+1;
所以a[n] = a[n/2] + a[n-2];
#include <iostream>
using namespace std;
int main()
{
int a[1001];
a[0] = 1; a[1] = 1;
for(int i = 2; i <= 1000; i++)
{
a[i] = a[i-2] + a[i/2];
}
int n;
while(cin >> n)
cout << a[n] << endl;
return 0;
}