HDU 2013 蟠桃记【递推】【递归】

来源:互联网 发布:武汉人工智能创业公司 编辑:程序博客网 时间:2024/05/22 15:05

蟠桃记

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 34406    Accepted Submission(s): 25912


Problem Description
喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!
什么问题?他研究的问题是蟠桃一共有多少个!
不过,到最后,他还是没能解决这个难题,呵呵^-^
当时的情况是这样的:
第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?
 


 

Input
输入数据有多组,每组占一行,包含一个正整数n(1<n<30),表示只剩下一个桃子的时候是在第n天发生的。
 


 

Output
对于每组输入数据,输出第一天开始吃的时候桃子的总数,每个测试实例占一行。
 


 

Sample Input
24
 


 

Sample Output
422
 


 

Author
lcy

 

 

解题思路:这道题可以用递推来写,也可以用递归来写。

                   递推解法:设sum为当前桃子数,a为剩余桃子数。

                                       悟空每天都吃掉桃子总数一半多一个 sum - sum/2 - 1 = a  =>  sum = (a+1)*2

                                       当第二天(看做最后一天)的桃子数只剩下1个时, 第一天的总数的为 sum = (1+1)*2 = 4

                                       当第三天(最后一天)的桃子数只剩下1个时,第二天的桃子数为 sum2 = (1+1)*2 = 4,第一天的桃子总数为 sum1= (sum2+1)*2 = (4+1)*2 = 10

 

                                       由此可得递推关系:sum = (a+1)*2。

                                       我们可以逆着推,从最后一天(剩余一个桃子时的天数)往前推,后一天的桃子数(未吃前)为前一天的桃子剩余量。只需要推n-1天。

 

#include<stdio.h>//递推 从后往前推 int main(){int n,i,sum;while(~scanf("%d",&n)){sum=1;for(i=n;i>1;i--)sum = (sum+1)*2;printf("%d\n",sum);}return 0;}


 

 递归解法:f(d)函数表示当前桃子数,d表示倒数第几天,当d为倒数第一天,返回1个桃子。否则返回 (f(d-1)+1)*2

                      当d=3时,表示第一天(倒数第三天),f(3) = (f(3)+1)*2   求f(2) 倒数第二天的桃子数

                      当d=2时,表示倒数第二天,f(2)=(f(1)+1)*2 ,求f(1)倒数第一天的桃子数。

                      当d=1时,已知最后一天剩余1个桃子,则f(1) = 1 ; f(2)=(1+1)*2=4 ; f(3)=(4+1)*2=10。

 

#include<stdio.h>int f(int d){    if(d==1) return 1;//d==1表示最后一天      else return (f(d-1)+1)*2; }int main(){    int n;    while(scanf("%d",&n)==1)    {printf("%d\n",f(n));}    return 0;}


 

  递归2:这种递归与上面那种一样。但是d表示当前天数, 当d= n时,返回1。否则返回 (f(n+1)+1)*2。

                从 d = 1 开始,不断往后推,直到求出d = n 时的 f(n) =1。

                例如当n = 3,f(3) = 1;  第三天的桃子数为1

                                         f(2)= (f(3)+1)*2   = 4 ,  第二天的桃子数为4

                                         f(d=1) = (f( 2) + 1)*2  =10  第一天的桃子数为10 

 

#include<stdio.h>int n;int f(int d){if(d==n) return 1;//递归 如果d为最后一天 则返回 1else return (f(d+1)+1)*2; }int main(){int s;while(scanf("%d",&n)!=EOF){s=f(1);printf("%d\n",s);}return 0;}


 

0 0
原创粉丝点击