猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。
第二天早上又将剩下的桃子吃掉一半,又多吃一个。
以后每天早上都吃了前一天剩下的一半零一个。
到第N天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。
输入格式
N
输出格式
桃子总数
样例输入
10
样例输出
1534
题目分析:
(1) 一个猴子,第一天摘了桃子总数不变。之后的每一天,
都吃了前一天的1 / 2多一个。
就是如果,前一天剩下16个,那就吃掉了16 / 2 + 1 = 9个,剩下16-9=7个。
(2)如果是奇数的情况,代码会处理成 17 / 2 向下取整,结果为8
、
(3)方法1,直接穷举,一共从a个桃子,到第N天,剩下了1个。
也就这N-1天里,每天都吃了,前一天的1/2 又多一个。
把剩下的桃子算出来。看是否等于1。如果不是,就a自增,直到等于为止
方法1:穷举遍历法:
package testt;import java.util.Scanner;public class Main {public static void main(String[] args) {int cnt=0;int a=0,b=0;//读取一共有N天Scanner scan = new Scanner(System.in);System.out.print("请输入猴子有多少天偷吃了桃二:");int N = scan.nextInt();while(true) {a++; //剩下的桃子总数b++; //同增//经过N-1天的迭代for( int i=0 ; i < N-1; i++) {a=(a/2-1);}if ( a != 1) {a = b; //不满足条件,重置}else {System.out.print ("一共有"+b+"个桃子");break;}}}
}
方法2:从最后一天,第N天 ---- 》 反推第一天:
package pack3;import java.util.Scanner;public class test2 {//反向推//设前一天为X[m],当天为X[m+1]//已知: X[m]/2 -1 = X[m+1]//可推出: X[m] = (X[m+1]+1)*2// 前一天 = 当天 * 2 +2//即! X[m] = X[m+1]*2 + 2public static void main(String[] args) {//N天截至Scanner scan = new Scanner(System.in);System.out.print("请输入有多少天:");int N = scan.nextInt();//创建数组存放每一天的量,最后加起来int pea[] = new int[N] ;//共3天,1 4 10int temp = 1;for( int i=N-2;i>=0;i--) {temp = 2 *temp +2; //从m+1 到 m pea[i] = temp;}int sum = 0;//遍历第j+1天的桃子 数组
// for( int j=0;j<=N-3 ; j++) {
// System.out.println( " 第"+(j+1)+"天的桃子数量为:"+pea[j]);
// }System.out.print( pea[0]);}
}