Ka的递归编程练习 Part5|数的计数(Noip2001)
1 #include<stdio.h> 2 int sp(int n) 3 { 4 if(n==1) return 1; 5 int s=0,i,e=n/2; 6 for(i=1;i<=e;i++) 7 s+=sp(i); 8 return s+e-1; 9 } 10 int main() 11 { 12 int n=8; 13 int r=sp(n)+1; 14 printf("%d",r); 15 }
出题人的语文真的不敢恭维——莎士比亚
【问题描述】
我们要求找出具有下列性质数的个数(包含输入的自然数n):
先输入一个自然数n(n≤1000), 然后对此自然数按照如下方法进行处理:
1.不作任何处理;
2.在它的左边加上一个自然数,但该自然数不能超过原数(输入的n)的一半;
3.加上数后,继续按此规则进行处理,直到不能再加自然数为止。
【输入样例】
6
满足条件的数为 6 (此部分不必输出)
16
26
126
36
136
【输出样例】
6
题目看不懂?解释一下:
比如8,8的一半是4,于是可以在8前加1,2,3,4
4的一半是2,那么可以在4前加1,2
2、3的一半是1,可以在2、3前加1
1没有得加
于是总共是:
8 ---- 18 ---- 28 128 ---- 38 138 ---- 48 148 248 1248
共10种。
可以看出有点规律,打表可以节约时间,但是懒得了\(≧▽≦)/
分析:
当数是1,自然只有一种情况,return 1
如果是其他数,那就是这种情况下的总情况啦
因为循环的时候没有加上原来的数量,所以加e补偿
但是f(1)的结果是1,要扣除,所以return的是s(情况总数)+e(数旁边不加的时候总数就是1)-1(f1已经加上了1,扣除补偿)
详见代码~~