ACM每日一练(猴子吃桃问题)

描述
有一堆桃子不知数目,猴子第一天吃掉一半,又多吃了一个,第二天照此方法,吃掉剩下桃子的一半又多一个,天天如此,到第m天早上,猴子发现只剩一只桃子了,问这堆桃子原来有多少个? (m<29)

输入
第一行有一个整数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);
 }
}

描述
给你一个乱序的字符串,里面包含有小写字母(a--z)以及一些特殊符号,请你找出所给字符串里面所有的小写字母的个数, 拿这个数对26取余,输出取余后的数字在子母表中对应的小写字母(0对应z,1对应a,2对应b....25对应y)。

输入
第一行是一个整数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);
 }
}

ACM每日一练(猴子吃桃问题)

时间: 2024-11-08 20:54:52

ACM每日一练(猴子吃桃问题)的相关文章

经典算法题每日演练——第三题 猴子吃桃

原文:经典算法题每日演练--第三题 猴子吃桃 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个.第二天早上又将剩下的桃子吃了一半,还是不过瘾又多 吃了一个.以后每天都吃前一天剩下的一半再加一个.到第10天刚好剩一个.问猴子第一天摘了多少个桃子? 分析: 这是一套非常经典的算法题,这个题目体现了算法思想中的递推思想,递归有两种形式,顺推和逆推,针对递推,只要 我们找到递推公式,问题就迎刃而解了. 令S10=1,容易看出 S9=2(S10+1), 简化一下 S9=2S10+2 S8=2S

ocrosoft 程序设计提高期末复习问题M 递归求猴子吃桃

http://acm.ocrosoft.com/problem.php?cid=1172&pid=12 题目描述 猴子吃桃问题.猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个.第2天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半另加一个.到第n天早上想再吃时,就只剩下一个桃子了.求第1天共摘了多少个桃子 输入 n的值 输出 剩下的桃子数量 样例输入 10 样例输出 total=1534 题解:运用递归的思想,定义的A的函数代表的是第n天开始的时候所有

循环-16. 猴子吃桃问题

循环-16. 猴子吃桃问题(15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 徐镜春(浙江大学) 一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个:第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半加一个.到第N天早上想再吃时,见只剩下一个桃子了.问:第一天共摘了多少个桃子? 输入格式: 输入在一行中给出正整数N(1<N<=10). 输出格式: 在一行中输出第一天共摘了多少

猴子吃桃问题

题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下 的一半零一个.到第10天早上想再吃时,见只剩下一个桃子了.求第一天共摘了多少. 程序分析:采取逆向思维的方法,从后往前推断. 1 package com.li.FiftyAlgorthm; 2 3 /** 4 * 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾, 又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了

猴子吃桃问题。

题目描述 猴子吃桃问题.猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个. 第二天早上又将剩下的桃子吃掉一半,又多吃一个.以后每天早上都吃了前一天剩下的一半零一个. 到第N天早上想再吃时,见只剩下一个桃子了.求第一天共摘多少桃子. 输入 N 输出 桃子总数 样例输入 10 样例输出 1534 代码:#include<stdio.h>int main(){    int N,i,sum=1;    scanf("%d",&N);     for(i=2;

C语言之猴子吃桃

猴子吃桃问题.猴子第一天摘下若干个桃子,当即吃了一半,好不过瘾,又多吃了一个.第二天早上又吃了剩下的桃子的一半,又多吃了一个.以后每天都吃了前一天剩下的一半零一个,到第 10 天早上想再吃的时候,就剩下一个桃子.求第一天共摘多少个桃子. 代码实现: #include <stdio.h> int sum_peach(const int n,int sum) {  int i=0;  for(i=n;i>0;i--)  {   sum=2*sum+1;  }  return sum; } i

兔子、棋盘放粮食、猴子吃桃

static void Main19篮球弹起的高度(string[] args) { //蓝球从5米高的地方落下,每次弹起的高度是上次的一半,问第n次弹起的高度? Console.WriteLine("请问弹起了几次?"); int n = Convert.ToInt32(Console.ReadLine()); double j = 5.0; for (int i = 0; i <= n - 1; i++) { j = j / 2; Console.WriteLine(j);

猴子吃桃问题,简单循环,函数

题目描述 猴子吃桃问题.猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个. 第二天早上又将剩下的桃子吃掉一半,又多吃一个.以后每天早上都吃了前一天剩下的一半零一个. 到第N天早上想再吃时,见只剩下一个桃子了.求第一天共摘多少桃子. 输入 N 输出 桃子总数 样例输入 10 样例输出 1534 此题反向思维,由最后一天反推,使用库函数解决 #include<iostream> #include<math.h> using namespace std; int main(

Python练习题 016:猴子吃桃

[Python练习题 016] 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个.第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半零一个.到第10天早上想再吃时,见只剩下一个桃子了.求第一天共摘了多少. -------------------------------------------------- 这题得倒着推.第10天还没吃,就剩1个,说明第9天吃完一半再吃1个还剩1个,假设第9天还没吃之前有桃子p个,可得:p * 1/2 -