C++ 代码:甲、乙、丙三人共有 384 本书,先由甲分给乙、丙,所给书数分别等于乙、丙已有的书数,再由乙分给甲、丙,最后由丙分给甲、乙,分法同前,结果三人图书数相等。编程求甲、乙、丙三人原各有书多少本?
时间: 2024-10-15 20:25:12 浏览: 35
C++-图书管理系统设计源代码.doc
5星 · 资源好评率100%
这个问题描述了一个经典的数学问题,也称为“分配循环”或“轮流分配”。我们可以使用递归来解决这个问题。设甲、乙、丙初始书的数量分别为a, b, c。经过一轮分配后,他们都会得到对方当前的数量,所以每轮之后他们的总数会变为原来的两倍。
我们知道最终三人的图书数相等,即最后每人都有384 / 3 = 128本书。现在我们从这个结果开始倒推:
1. 在最后一次分发之前,每个人都有128本书。所以在丙分给甲和乙之前,他有128 + (a+b)本书。
2. 同样,在乙分给甲和丙之前,她有128 + (c+128+a+b)本书,因为丙给了她128本。
3. 最初,甲有128 + (b+128+c+128+a+b)本书。
将这些方程联立起来,我们得到:
a + b + c = 384 - 3 * 128 (因为初始总和)
a + (128+b) = b + (128+c)
(128+b) + (c+128+a+b) = a + (b+128+c)
通过解这个线性方程组,可以找到a、b、c的初始值。以下是简单的C++代码实现这一过程:
```cpp
#include <iostream>
using namespace std;
void distributeBooks(int totalBooks, int& a, int& b, int& c) {
if(totalBooks == 0) {
cout << "甲原有:" << a << ", 乙原有:" << b << ", 丙原有:" << c << endl;
return;
}
int tempA = a, tempB = b, tempC = c;
a = totalBooks / 3;
b = a + tempC;
c = a + tempB;
distributeBooks(totalBooks - 3*a, tempA, tempB, tempC);
}
int main() {
int totalBooks = 384;
int a = 0, b = 0, c = 0;
distributeBooks(totalBooks, a, b, c);
return 0;
}
```
运行此程序后,它将输出甲、乙、丙最初各有多少本书。
阅读全文