简单的分橘子问题

8 篇文章 0 订阅

日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完 后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?

(1) 题目分析

分析题目可以发现只有第一个儿子与其他儿子不一样,第一个儿子是先分后加,其他儿子都是先加后分,那我想突破口应该就在想这,再思索一下第六个孩子,由第六个儿子橘子数x*(1-1/3)=420;可得x=630,第六个儿子给大儿子分了1/3 =210个桔子,由y*7/8+210=420可以得出第一个儿子的初始桔子数y=240,因此便可递归的求解下去

(2)算法构造:

这里用两个数组:
int[] st = { 420, 420, 420, 420, 420, 420 };//纪录每个儿子初始的桔子数量
int[] st1={0,0,0,0,0,0};//记录每个儿子即将分出桔子时的桔子数 ,初始为0
大孩子的初始初始桔子数和即将分出橘子时的桔子数相等
首先计算出第一个孩子的初始橘子数,
if(j==0){
int x=(420-4203/21/3)*i/(i-1);//计算出大儿子的初始桔子数
st[j]=x;// 大儿子的初始桔子数,也是即将分出桔子之前的桔子数
st1[j]=x;
}
然后利用公示递归的算出每个孩子的桔子数
int y=st[j]*i/(i-1)-st1[j-1]*1/(i+1);//计算出对应儿子的初始桔子数
st1[j]=st[j]*i/(i-1);//即将分出桔子之前的桔子数
st[j]=y;

递归体:

if(j==0){
			int x=(420-420*3/2*1/3)*i/(i-1);//计算出大儿子的初始桔子数
			st[j]=x;// 大儿子的初始桔子数,也是即将分出桔子之前的桔子数
			st1[j]=x;
		}
		i=i-1;//变量分母减一
		j=j+1;//数据下标加一
		if(j<=5){//避免数组越界
			int y=st[j]*i/(i-1)-st1[j-1]*1/(i+1);//计算出对应儿子的初始桔子数
			st1[j]=st[j]*i/(i-1);//即将分出桔子之前的桔子数
			st[j]=y;

递归出口:j>6:

(3)函数实现:

public void Orangs(int j,int i){
		if(j==0){
			int x=(420-420*3/2*1/3)*i/(i-1);//计算出大儿子的初始桔子数
			st[j]=x;// 大儿子的初始桔子数,也是即将分出桔子之前的桔子数
			st1[j]=x;
		}
		i=i-1;//变量分母减一
		j=j+1;//数据下标加一
		if(j<=5){//避免数组越界
			int y=st[j]*i/(i-1)-st1[j-1]*1/(i+1);//计算出对应儿子的初始桔子数
			st1[j]=st[j]*i/(i-1);//即将分出桔子之前的桔子数
			st[j]=y;
			Orangs(j,i);//当未算到最后一个儿子时,递归调用继续计算
		}
		System.out.println("第"+(j)+"个儿子原始桔子数为"+st[j-1]);//打印出st[]数组对应的儿子的桔子数
	}

(4)运行截图:

在这里插入图片描述

源代码


/**
 * @类描述:日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。
 * 		分完 后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;
 * 		老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;
 * 		老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。
 * 		结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?
 * @类名称:Orange
 * @创建人:司志杰
 * @创建时间:2018年11月18日下午2:22:35
 * @修改人:司志杰
 * @修改时间:2018年11月18日下午2:22:35
 * @修改备注:
 * @version v1.0
 * @mail 1904479327@qq.com
 
 */
public class Orange {
	static int j = 0;//记录数组下标
	static int i = 8;//;类似于1/8,记录分母的变量,初始为8
	int[] st = { 420, 420, 420, 420, 420, 420 };//纪录每个儿子初始的桔子数量
	int[] st1={0,0,0,0,0,0};//记录每个儿子即将分出桔子时的桔子数 ,初始为0
	public static void main(String args[]) {
		new Orange().Orangs(j,i);
	}
	/**
	 * @描述:用来计算每个二字初始桔子数的函数
		·	分析题目可以发现只有第一个儿子与其他儿子不一样,第一个儿子是先分后加,其他儿子都是先加后分
			因此由第六个儿子橘子数st1【5】*(1-1/3)=420;可得st1[5]=630 第六个儿子给大儿子分了210个桔子
			所以由st【0】*7/8+210=420可以得出第一个儿子的初始桔子数240,因此便可求解下去
	 * @方法名: Orangs
	 * @param j
	 * @param i
	 * @返回类型 void
	 * @创建人 szj
	 * @创建时间 2018年11月18日下午2:29:38
	 * @修改人 szj
	 * @修改时间 2018年11月18日下午2:29:38
	 * @修改备注
	 */
	public void Orangs(int j,int i){
		if(j==0){
			int x=(420-420*3/2*1/3)*i/(i-1);//计算出大儿子的初始桔子数
			st[j]=x;// 大儿子的初始桔子数,也是即将分出桔子之前的桔子数
			st1[j]=x;
		}
		i=i-1;//变量分母减一
		j=j+1;//数据下标加一
		if(j<=5){//避免数组越界
			int y=st[j]*i/(i-1)-st1[j-1]*1/(i+1);//计算出对应儿子的初始桔子数
			st1[j]=st[j]*i/(i-1);//即将分出桔子之前的桔子数
			st[j]=y;
			Orangs(j,i);//当未算到最后一个儿子时,递归调用继续计算
		}
		System.out.println("第"+(j)+"个儿子原始桔子数为"+st[j-1]);//打印出st[]数组对应的儿子的桔子数
	}
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的用C语言实现的橘子苹果问题的代码,使用Linux系统的进程同步机制解决竞争问题。代码中使用了互斥锁和条件变量来实现进程之间的同步。 ``` #include <stdio.h> #include <stdlib.h> #include <pthread.h> #define MAX 10 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 互斥锁 pthread_cond_t apple_ready = PTHREAD_COND_INITIALIZER; // 条件变量 pthread_cond_t orange_ready = PTHREAD_COND_INITIALIZER; // 条件变量 int basket = 0; // 篮子中的水果数 void *apple(void *arg) { int i; for (i = 0; i < MAX; i++) { pthread_mutex_lock(&mutex); while (basket != 0) { // 如果篮子不为空,就等待 pthread_cond_wait(&apple_ready, &mutex); } basket = 1; // 将一个苹果放入篮子 printf("Put an apple into the basket.\n"); pthread_mutex_unlock(&mutex); pthread_cond_signal(&orange_ready); // 唤醒等待的橘子进程 } pthread_exit(NULL); } void *orange(void *arg) { int i; for (i = 0; i < MAX; i++) { pthread_mutex_lock(&mutex); while (basket != 1) { // 如果篮子不为满,就等待 pthread_cond_wait(&orange_ready, &mutex); } basket = 0; // 将一个橘子放入篮子 printf("Put an orange into the basket.\n"); pthread_mutex_unlock(&mutex); pthread_cond_signal(&apple_ready); // 唤醒等待的苹果进程 } pthread_exit(NULL); } int main() { pthread_t tid1, tid2; pthread_create(&tid1, NULL, apple, NULL); pthread_create(&tid2, NULL, orange, NULL); pthread_join(tid1, NULL); pthread_join(tid2, NULL); return 0; } ``` 在这个代码中,我们使用了互斥锁来保证对篮子的访问是互斥的,确保每次只有一个进程可以访问篮子。同时,使用条件变量来实现进程之间的同步。苹果进程在篮子不为空的情况下等待,等待橘子进程将橘子放入篮子并唤醒自己;橘子进程在篮子不为满的情况下等待,等待苹果进程将苹果放入篮子并唤醒自己。 注意,在代码中使用`pthread_cond_wait()`和`pthread_cond_signal()`函数时,需要先获取互斥锁,以确保操作的原子性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值