递归求桔子数

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

 

 

 

 

 

题目描述 25 贝蒂买桔子 20 全屏浏览 作者 朱允刚 单位 吉林大学 贝蒂去超市买桔子,超市有n个桔子,每个桔子都有唯一的英文字母标号,贝蒂打算从所有桔子中挑选出若干个桔子买(也可能一个都不买),请编写程序帮助贝蒂出所有可能的挑法。每种挑法按字典序给出各桔子的标号。 字典序,即字符串在字典中的顺序。对于两个字符串,从第一个字符开始比较,当某一个位置的字符不同时,该位置字符较小的串,字典序较小,例如abc比abd小。 输入格式: 输入为一个正整n,表示超市里的桔子,n不超过15。桔子的标号为a, b, c, d…。若n=1,桔子为a;若n=3,桔子为a, b, c;若n=4,桔子为a, b, c, d;以此类推。 输出格式: 输出为若干行字符串,每行表示贝蒂的一种挑法。每种挑法用{}包含,每个桔子的标号用西文逗号间隔,例如{a,b,c},标号须按字典序排列。“什么也不买”对应的挑法最先输出,为{},中间无空格。 输入样例: 3 输出样例: {} {a} {a,b} {a,b,c} {a,c} {b} {b,c} {c} 代码长度限制 16 KB 时间限制 20 ms 内存限制 64 MB 栈限制 8192 KB C (gcc) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #include <stdio.h> #include <string.h> void printSubset(int n, int mask) { printf("{"); int first = 1; for (int i = 0; i < n; i++) { if (mask & (1 << i)) { if (!first) { printf(","); } printf("%c", 'a' + i); first = 0; } } printf("}\n"); } int main() { int n; scanf("%d", &n); int total = 1 << n; for (int mask = 0; mask < total; mask++) { printSubset(n, mask); } return 0; } 测试用例 查看上次提交 提交本题作答 退出答题 题目总览 作答 / 题 编程题 29/32 编程题 图例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 当前1 - 32项,共32项 概览 题目列表 提交列表 排名
最新发布
09-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值