题目链接: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
", 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“ )