目录
前言:
开新专栏了,讲解100道基础语法编程题
用c语言讲解
目的是复习c语言中的基础语法,为单片机中的c语言代码分析做铺垫
专栏链接:
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;
}