分桔子的问题

来源:百度知道 编辑:UC知道 时间:2024/06/19 03:42:42
日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?
#include<iostream>
using namespace std;

void main()
{

int i;
int j;

int iX[6];//六个孩子最初分到的桔子
memset(iX,0,sizeof(iX) );

int iSum[6];//六个孩子最后得到的桔子应该相等为2520/6

memset(iSum,0,sizeof(iSum) );

for (iX[0]=1;iX[0]<2520;iX[0]++)//老大的桔子的变化范围
{

for (iX[1]=1;iX[1]<2520;iX[1]++)//老二的桔子的变化范围
{
for (iX[2]=1;iX[2]<2520;iX[2]++)//老三的桔子的变化范围
{
for (iX[3]=1;iX[3]<2520;iX[3]++)//老四的桔子的变化范围
{
for (iX[4]=1;iX[4]<2520;iX[4]++)//老五的桔子的变化范围
{
for (iX[5]=1;iX[5]<2520;iX[5]++)//老六的桔子的变化范围
{
for (i=0;i<5;i++)
{
for (j=8;j>=1;j--)
{
if (

如果用数学方法推导,也不难:

int iX[6];//六个孩子最初分到的桔子

(iX[0]*1/8+iX[1])*6/7=PER;
((iX[0]*1/8+iX[1])*1/7+iX[2])*5/6=PER;
(((iX[0]*1/8+iX[1])*1/7+iX[2])*1/6+iX[3])*4/5=PER;
((((iX[0]*1/8+iX[1])*1/7+iX[2])*1/6+iX[3])*1/5+iX[4])*3/4=PER;
(((((iX[0]*1/8+iX[1])*1/7+iX[2])*1/6+iX[3])*1/5+iX[4])*1/4+iX[5])*2/3=PER;
(((((iX[0]*1/8+iX[1])*1/7+iX[2])*1/6+iX[3])*1/5+iX[4])*1/4+iX[5])*1/3+iX[0]*7/8=PER;

从最后两个式子往前推。由倒数第二式,可以得出:
(((((iX[0]*1/8+iX[1])*1/7+iX[2])*1/6+iX[3])*1/5+iX[4])*1/4+iX[5])=PER*3/2=630;
代入最后一式,可以求得iX[0]:
iX[0]=(PER-630*1/3)*8/7=(420-210)*8/7=240;

然后,再从第一个式子往后推:
iX[1]=PER*7/6-240*1/8=490-30=460;
iX[2]=PER*6/5-490*1/7=504-70=434;
iX[3]=PER*5/4-504*1/6=525-84=441;
iX[4]=PER*4/3-525*1/5=560-105=455;
iX[5]=PER*3/2-560*1/4=630-140=490;

我在你的程序基础上修改了一下:
#include<iostream>
using namespace std;

const int TOTAL=2520;
const int PER=T