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,扣除补偿)

详见代码~~

原文地址:https://www.cnblogs.com/KakagouLT/p/4497888.html