Fork me on GitHub

HDU 2013 (水)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2013

题目大意:已知最后一天桃子只有一个,告诉你猴崽子第一天吃掉总桃子数的一半多一个,第二天吃掉剩下总数的一半多一个,给你剩下一个桃子事件是在第 n 天发生的,求桃子总数

解题思路:

很水,想一下就出来了

方法一:for 倒着推

方法二:简单基本递归入门

代码:

 方法一:

 1 #include<iostream>
 2 #include<cmath>
 3 #include<iomanip>
 4 //#include<algorithm>
 5 using namespace std;
 6 int num;
 7 int main()
 8 {
 9     int n;
10     int sum;
11     int p;
12     while(cin >> n)
13     {
14         sum = 0;
15         p = 1;
16         for(int i = 0; i < n - 1; i ++)
17         {
18             sum += (p + 1) * 2;
19             p = sum;
20             sum = 0;
21         }
22         cout << p << endl;
23     }
24 }

 方法二:

 

 1 #include<stdio.h>
 2 int n;
 3 int tao(int cur) {
 4     if(cur == n) return 1;
 5     return 2*(tao(cur+1)+1);
 6 }
 7 int main() {
 8     while(scanf("%d", &n)!=EOF) {
 9         printf("%d\n", tao(1));
10     }
11     return 0;
12 }

 

 

 

总感觉for 写的蠢蠢的,不知道该怎么修改优化~喵喵喵?

    

                              ****************************更新****************************(优化方法一的 for 写法)

 1 #include<iostream>
 2 #include<cmath>
 3 #include<iomanip>
 4 //#include<algorithm>
 5 using namespace std;
 6 int num;
 7 int main()
 8 {
 9     int n;
10     int sum = 1;
11     while(cin >> n)
12     {
13         sum = 1;
14         for(int i = 0; i < n - 1; i ++)
15         {
16             sum = (sum + 1) << 1;
17         }
18         cout << sum << endl;
19     }
20 }

 基本移位操作:“<< n” 乘以 2n   ( 空出地方补 “0”)

                         “>> n” 除以 2n      (正数空出地方补 “0”     负数补 ”1“ )

posted @ 2018-07-26 16:41  GerJCS  阅读(205)  评论(0编辑  收藏  举报