日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完 后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?
/*
File name:求橘子数.cpp
Author:杨柳
Date:2017/5/22
IDE:DEV-c++
*/
/*
经过分析:
1.sum=2520 aver=2520/6=420
2.老六得到橘子后,给老大1/3后为420,所以给了老大210,老大给出原来的1/8加得到的210对于420,所以原来有240个橘子
3.下一个人原来的橘子数:(nextfirstnum+givernum)*(7-n)/(8-n)=420 firstnum=420*(8-n)/(7-n)-givertnum
递归公式:
f(firstnum,foregivernum,n){
return 0 n>6
return orangenum(nextfirstnum,givernum,n) givernum=firstnum/(9-n) n=1 or givernum=(firstnum+foregivernum)/(9-n) n>1
}
*/
#include<iostream>
using namespace std;
int orangenum(int firstnum,int foregivernum,int n){ //first代表原有的橘子, forenum代表前n-1一个人给的橘子数,n代表老几
int givernum=0;
if(n>5){
return 0;
}
else{
//计算分给下一个数目
if(n==1){ //第一个人是先直接给
cout<<"老"<<n<<"原来的橘子数:"<<firstnum<<endl;
cout<<"老"<<n<<"得到的橘子数:"<<foregivernum<<endl;
givernum=firstnum/(9-n);
cout<<"老"<<n<<"给出的橘子数:"<<givernum<<endl;
foregivernum=givernum;
}
else{ //先得到后再给
cout<<"老"<<n<<"得到的橘子数:"<<foregivernum<<endl;
int givernum=(firstnum+foregivernum)/(9-n);//当前给出的橘子数
cout<<"老"<<n<<"给出的橘子数:"<<givernum<<endl;
foregivernum=givernum;
}
//下一个人原来的橘子数
int firstnum=420*(8-n)/(7-n)-foregivernum;
cout<<endl<<"老"<<n+1<<"原来的橘子数:"<<firstnum<<endl;
n=n+1;
orangenum(firstnum,foregivernum,n);
}
}
int main(){
orangenum(240,210,1);
return 0;
}