题目描述
公共汽车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上、下车,但上、下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人。
从第3站起(包括第3站)上、下车的人数有一定的规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第n-1站),都满足此规律。
现给出的条件是:共有n个车站,始发站上车的人数为a,最后一站下车的人数是m(全部下车)。试问从C站开出时车上的人数是多少?
输入
只有一行,四个整数a,n,m和x
输出
x站开出时车上的人数
输入输出样例
输入样例1 <-复制
5 7 32 4
输出样例1
13
AC代码
#include <stdio.h>
int dinzhan(int a, int n, int y);
int main()
{
int a, n, m, x;
int i, sum = 0, y;
scanf("%d%d%d%d", &a, &n, &m, &x);
// 通过遍历 y 的值,找到满足条件的 y
for (y = 1;; y++)
{
sum = 0;
// 计算每一站上车的人数之和
for (i = 1; i < n; i++)
{
sum += dinzhan(a, i, y);
}
if (sum == m)
break; // 找到满足条件的 y 值,跳出循环
}
sum = 0;
// 计算第 x 站开出时车上的人数
for (i = 1; i <= x; i++)
{
sum += dinzhan(a, i, y);
}
printf("%d", sum); // 输出结果
return 0;
}
// 递归函数,计算第 n 站上车的人数
int dinzhan(int a, int n, int y)
{
if (n == 1)
return a;
if (n == 2)
return 0;
if (n == 3)
return a;
if (n == 4)
return y;
if (n >= 5)
return dinzhan(a, n - 1, y) + dinzhan(a, n - 2, y);
}
根据输入的四个整数 a、n、m 和 x,计算从第 x 站开出时车上的人数。
主要的逻辑是通过遍历 y 的值,找到满足条件的 y,然后根据递归函数 dinzhan()
计算每一站上车的人数之和。最后,计算第 x 站开出时车上的人数并输出。
(by 归忆)