首页 > 试题广场 >

蟠桃记

[编程题]蟠桃记
  • 热度指数:2801 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!
什么问题?他研究的问题是蟠桃一共有多少个!
不过,到最后,他还是没能解决这个难题,呵呵^-^
当时的情况是这样的:
第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?

输入描述:
输入数据有多组,每组占一行,包含一个正整数n(1≤n≤30),表示只剩下一个桃子的时候是在第n天发生的。


输出描述:
对于每组输入数据,输出第一天开始吃的时候桃子的总数,每个测试实例占一行。
示例1

输入

2<br/>4

输出

4<br/>22

很玄学的一道题,使用input()会报错??

发表于 2017-10-11 10:15:15 回复(3)
#include<stdio.h>
int main()
{
	int i,n,num[30];

	num[1]=1;
	for(i=2;i<31;i++)
		num[i]=(num[i-1]+1)*2;
	while(scanf("%d",&n)!=-1&&n)
	{
		printf("%d\n",num[n]);
	}
	return 0;
} 
发表于 2020-04-13 16:38:23 回复(0)
#include<iostream>
#include<vector>
using namespace std;
 
intmain()
{
    vector<int> ivec(30, 0);
    intn;
    while(cin>>n)
    {
        if(n == 0) break;
        ivec[0] = 1;
        for(inti = 1; i < n; i++)
        {
            ivec[i] = (ivec[i - 1] + 1) * 2;
        }
        cout << ivec[n - 1] << "\n";
    }
     
    return0;
}
发表于 2018-07-10 14:24:39 回复(0)
题目要求N的范围是1到30,测试样例却给出了0的情况而且还不说明
#include <iostream>
using namespace std;
int main()
{		
	int num, rest;
	while (cin >> num)
	{
		if (num == 0)
			continue;
		rest = 1;
		for (int i = 0; i < num-1; i++)
			rest = 2 * (rest + 1);		
		cout << rest << endl;
	}
	return 0;
}

发表于 2017-04-19 13:35:53 回复(0)
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define N

int main(){
	long long a[31];
	a[0]=a[1]=1;a[2]=4;
int min=2;
    int n;
 	while((scanf("%d",&n))!=EOF){
 		if(n==0)break;//此为坑。
 		if(n>min){
 				for(int i=min+1;i<=n;i++){
		a[i]=(a[i-1]+1)*2;
	}min=n;
		 }
 	printf("%lld\n",a[n]); 

 };


return 0;
}


发表于 2016-01-21 19:34:44 回复(0)
啥头像
注意:
测试用例有n=0的情况,此时不用输出

#include <iostream>
#include <stdio.h>

#define N 31

using namespace std;

int main()
{
    int peach[N] = {0, 1};
    for(int i=2; i<N; i++) {
        peach[i] = 2*(peach[i-1]+1);
    }
    int n;
    while(~scanf("%d", &n)) {
        if(n) printf("%d\n", peach[n]);
    }
    return 0;
} 


发表于 2016-01-10 20:16:48 回复(0)
L0L头像 L0L
//f(x)=2f(x-1)+2====>f(x)=3*2^(n-1)-2
#include<iostream>
using namespace std;
int main(){
    int n;
    while(cin>>n){
        if(n!=0){
            cout<<3*(1<<(n-1))-2<<endl;
        }   
    }
    return 0;
}

编辑于 2015-08-26 15:18:39 回复(1)
任何算法归根结底都是数学问题,主要找出递推公式就行。
#include "stdio.h"
#include "math.h"
int main(){
    int n,count;
    char eat;
    while(scanf("%d",&n)!=EOF){
        scanf("%c",&eat);
        count=3*(pow(2,n-1))-2;
        if(n) printf("%d\n",count); 
    }
}

发表于 2021-03-20 21:33:02 回复(0)


这题简单吧,没啥套路。
根据题意"每天吃剩余桃子的一半多一个",也就是说第n天是第n - 1天的2倍多两个,即f(n) = (f(n - 1) + 1) * 2

#include <iostream>
using namespace std;

int main() {
    int n = 0;
    //fTable[n]第n天剩余1个时的总数
    long long fTable[31] = {0, 1};
    for (int i = 2; i < 31; ++i) {
        //递推计算第i天剩余1个时的总数
        fTable[i] = (fTable[i - 1] + 1) * 2;
    }
    //scanf返回值为正确输入数据的变量个数,当一个变量都没有成功获取数据时,此时返回-1
    while (scanf("%d", &n) != - 1) {
        if (n == 0) {
            break;
        }
        //查表即可
        printf("%lld\n", fTable[n]);
    }
    return 0;
}
————————————————
版权声明:本文为CSDN博主「hestyle」的原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://hestyle.blog.csdn.net/article/details/104692939
发表于 2020-03-06 12:08:10 回复(2)
//今天有i个,昨天应有2(i+1)个
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int n;
    while(~scanf("%d", &n))
    {
        if(n == 0)
            continue;
        int result = 1;
        while(--n)
            result = 2 * (result + 1);
        printf("%d\n", result);
    }
}
出题的有点问题吧,n>=1,你测试用例给整个0
编辑于 2020-03-03 18:57:22 回复(0)
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            int n=sc.nextInt();
            int result=1;
            if(n>0){
                for(int i=0;i<n-1;i++){
                    result=(1+result)*2;
                }
                System.out.println(result);
            }
        }
    }
}

发表于 2018-10-01 12:47:53 回复(0)
思路 : 题目有问题 n = 0,是不应该出现的,看了答案就知道了。
#include <iostream>
using namespace std;

long long Peach(int n)
{

    long long sum = 1;

    while (n != 1)
    {
        n--;
        sum = 2*(sum + 1);
    }
    return sum;
}

int main()
{
    int n;
    while (cin >> n)
    {
        if (n == 0)
            break;
        cout << Peach(n) << endl;
    }
}

发表于 2018-08-12 22:23:25 回复(0)
//测试用例有问题吧,明明说了n>=1,居然测试0...
//对于这种题目,哥有三种方法让他跪地求饶
a = [0, 1]
for i in range(2, 31):
    a.append(2*a[i-1]+2)
while True:
    try:
        n = int(input())
        if n==0:
            pass
        else:    
            print(a[n])
    except:
        break
//c语言写法
#include <stdio.h>
#define maxN 31
int main()
{
    int N;
    int i;
    int a[31] = {0, 1};
    for(i=2;i<maxN;i++)
    {
        a[i] = 2*a[i-1] +2;
    }
    while(scanf("%d", &N)!=EOF)
    {
        if(N!=0)
        {
            printf("%d\n", a[N]);
        }
    }
    return 0;
}
//java 写法
import java.util.Scanner;
public class Main
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        int i;
        int N;
        int maxN = 31;
        int[] ar = new int[maxN];
        ar[1] = 1;
        for(i=2; i<maxN; i++)
        {
            ar[i] = 2*ar[i-1] + 2;
        }
        while(true)
        {
            N = in.nextInt();
            if("EOF".equals(N))
            {
                break;
            }
            else
            {
                if(N!=0)
                {
                    System.out.println(ar[N]);
                }
            }
        }
    }
}

编辑于 2017-12-05 18:56:13 回复(0)
#include <stdio.h>
 
intcal(intn) {
    if(n == 1)
        return1;
    else
        return(cal(n - 1) + 1) * 2;
}
 
intmain() {
    intn;
    while(scanf("%d", &n)!=EOF)
        printf("%d\n", cal(n));
}
为什么会错???????????
编辑于 2017-10-18 16:56:31 回复(0)
题目也不说明下n=0的情况
import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int n = sc.nextInt();
            int count = 1;
            if(n != 0){
                while(n>1){
                    count = 2*count+2;
                    n--;
                }
                System.out.println(count);
            }else{
                continue;
            }
        }
    }
}

发表于 2017-09-30 16:25:58 回复(0)
#include<stdio.h>
intmain(){
    intn,i;
    inta[32]={0,1,4};
    for(i=2;i<=30;i++)
       a[i]=2*a[i-1]+2;
    while(~scanf("%d",&n) && n)
      printf("%d\n",a[n]);  
    return0;
}
发表于 2017-05-28 11:15:12 回复(0)
#include <iostream>

using namespace std;

int main()
{
long array[32] = { 0 };
int n = 0;

array[1] = 1;

for (int i = 2; i <= 30;i++)
{
array[i] = (array[i - 1] + 1) * 2;//逆推
}

while (scanf("%d",&n)!=EOF)
{
if (n>0)
{
cout << array[n] << endl;
}
}

return 0;
}
发表于 2015-10-20 16:17:29 回复(0)
推导出公式就是这样的,N代表N天。  long res = (1<<N )+ (1<<(N-1)) -2;
发表于 2015-06-28 11:21:15 回复(0)