[编程题]14、蟠桃记

目录

前言:

1、题目展示:

2、问题分析:

 3、最佳解法展示:


前言:

开新专栏了,讲解100道基础语法编程题

用c语言讲解

目的是复习c语言中的基础语法,为单片机中的c语言代码分析做铺垫

专栏链接:

c语言基础语法编程题_1zero10的博客-优快云博客

1、题目展示:

2、问题分析:

本题最关键的点就在于这句话:

第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。 聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?

已知从第一天到第n天最后剩1个桃子,求最开始有几个桃,这个问题是数学中的逆向递推等比数列问题

我们分析的时候要搞清楚,每一项到底是什么

在本题中

我们假设第一天没吃桃子之前,桃子总数为第一项

然后第二项是,第一天吃完剩下的桃子数

第三项是,第二天吃完剩下的桃子数

以此类推

第n项是,第n-1天吃完剩下的桃子数,为1

然后我们开始逆向递推寻找规律

以下内容我用纸写下来,方便大家理解

 

 下面我们来演示第一种方法,利用循环实现逆推过程

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
        int n;//第n天
        while (scanf("%d", &n) == 1) {
                int sum = 1;//第n天剩的1个桃
                for (int i = 1;i <= n - 1;++i) {
                        sum = (sum + 1) * 2;
                }
                printf("%d\n", sum);
        }

        return 0;
}

主要解释第8行的意思:

由上面两张图可知,

逆推的逻辑就是每次把上一次的桃子个数,执行先加1再乘以2的操作

下面是第二种方法:直接一开始桃的总数与第n天之间的关系,用公式计算

 

公式法的方法1:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main() {
        int n;//第n天
        while (scanf("%d", &n) == 1) {
                double x = 3.0 * pow(2, n - 1) - 2;
                printf("%.0lf\n", x);//结果不显示小数点
        }
        return 0;
}

 注意:pow函数的返回值是double类型!切要包含头文件

公式法的方法2:

由于是以2为底数的指数,所以可以用左移运算符!,左移多少就表示2的几次方

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
    int n;
    while (scanf("%d", &n) == 1) {
        int x = (3 << (n - 1)) - 2;  // 正确3*(n-1) + 减2,注意运算的先后顺序
        printf("%d\n", x);
    }
    return 0;
}

 

 3、最佳解法展示:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
        int n;//第n天
        while (scanf("%d", &n) == 1) {
                int sum = 1;//第n天剩的1个桃
                for (int i = 1;i <= n - 1;++i) {
                        sum = (sum + 1) * 2;
                }
                printf("%d\n", sum);
        }

        return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值