首页 > 代码库 > ACM每日一练(猴子吃桃问题)
ACM每日一练(猴子吃桃问题)
- 输入
- 第一行有一个整数n,表示有n组测试数据(从第二行开始,每一行的数据为:第m天);
- 输出
- 每一行数据是桃子的总个数
- 样例输入
2 3 11
- 样例输出
22 6142
普通解法
分析: 倒推 前一天的桃子总数 与后一天的桃子总数关系
递推公式是 a[m-1]=(a[m]+1)*2;
我们可以通过循环m次求出第一天的桃子总数。
#include <stdio.h> main() { int i,n,m,sum; scanf("%d",&n); while(n--) { sum=1; scanf("%d",&m); for (i=m;i>0;i--) sum=2*(sum+1); printf("%d\n",sum); } }
递归解法
将前面的for循环改为递归调用
#include <stdio.h> int sum(int n) { if (n==0) return 1; else return 2*(sum(n-1)+1); } main() { int m,n; scanf("%d",&m); while(m--) { scanf("%d",&n); printf("%d\n",sum(n)); } }
最简解法
分析
a[0]=1
a[1]=(a[0]+1)*2
...
a[n-1]=(a[n-2]+1)*2
a[n]=(a[n-1]+1)*2
由上可求出该数列的通项公式为a[n]=3*(pow(2,n))-2
则程序可以改进为
#include <stdio.h> main() { int m,n; scanf("%d",&m); while(m--) { scanf("%d",&n); //3左移n位 相当于 3*pow(2,n) printf("%d\n",(3<<n)-2); } }
- 输入
- 第一行是一个整数n(1<n<1000)表示接下来有n行的字符串m(1<m<200)需要输入
- 输出
- 输出对应的小写字母 每个小写字母单独占一行
- 样例输入
2 asdasl+%$^&ksdhkjhjksd adklf&(%^(alkha
- 样例输出
q j
#include <stdio.h> main() { int i,n; char c[198]; scanf("%d",&n); while(n--) { int count=0; scanf("%s",c); for(i=0;c[i]!='\0';i++) if (c[i]>96 && c[i]<123) count++; if (count%26==0) printf("z\n"); else printf("%c\n",count%26+96); } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。