递归求桔子数

日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将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;
} 

 

 

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值