zoukankan      html  css  js  c++  java
  • 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,扣除补偿)

    详见代码~~

  • 相关阅读:
    团队计划
    python数据处理学习
    ShellExecute函数
    WinAPI WinMain函数
    I2C相关知识学习
    JavaScript多元运算符
    彻底理解js中的&&和||
    彻底理解线程同步与同步代码块synchronized
    JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释
    JS参数使用带参数的方法
  • 原文地址:https://www.cnblogs.com/KakagouLT/p/4497888.html
Copyright © 2011-2022 走看看