CODE[VS]-数的计算-递推-天梯白银

题目描述 Description

  我们要求找出具有下列性质数的个数(包含输入的自然数n):
  先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理:
  1.不作任何处理;
  2.在它的左边加上一个自然数,但该自然数不能超过原数的一半;
  3.加上数后,继续按此规则进行处理,直到不能再加自然数为止.
 输入输出格式 Input/output
输入格式:
一个自然数n(n<=1000)
输出格式:
一个整数,表示具有该性质数的个数。
 输入输出样例 Sample input/output
样例测试点#1

输入样例:

6

输出样例:

6

 

思路:这题可以单纯地用模拟来做,但是这会比较麻烦,不如考虑用递推来做更快

要用递推肯定要先求出递推公式,随便代入几个数据就可以发现规律如下图所示:

从这张表可以发现,对于奇数的i,a[i]的值是和前面的偶数的a[i]值是一样的,所以得到公式①:a[i]=a[i-1](i%2==1)

那么对于偶数呢?这就可能有点小难度了,通过观察a[i]这一行可以发现,任何一个值都能在前面找到两个数使得这两个数相加恰好等于这个值,那么是不是这样呢?如果是那两个值的下标i是固定的算法么?

举个栗子:如果i=6,对应的a[i]=6,从前面的值开始找,6=2+4,a[i]值为2的i=6/2,a[i]值为4的i=6-1,从这里基本就可以得到公式②:a[i]=a[i-1]+a[i/2](i%2==0)

再举个栗子验证一下:如果i=10,那么i/2,i-1对应的a[i]值为4、6,4+6=10,所以我们就可以认定这个就是正确的递推公式了^_^

首先对于数组进行初始化处理,这里我的i是从3开始循环的,a[1]=1,a[2]=2,然后就可以开始用循环了,记得要分情况讨论(奇数偶数是不一样的公式)

 

代码如下:

 1 #include <stdio.h>    
 2 int main()    
 3 {    
 4     int a[1001]={0},n,i;   
 5     scanf("%d",&n);  
 6     a[1]=1;  
 7     a[2]=2;    
 8     for(i=3;i<=n;i++)  
 9     {
10         if(i%2==1) 
11         {
12             a[i]=a[i-1];           
13         }
14         else
15         {
16             a[i]=a[i-1]+a[i/2];//递推公式 
17         }         
18     }       
19     printf("%d\n",a[n]);   
20     return 0;    
21 }    

 

posted @ 2016-07-16 11:54  Memoryヾノ战心  阅读(321)  评论(0编辑  收藏  举报