一.题目概要:
一家农户以果园为生,一天,父亲推出一车苹果, 共2520个,准备分给他的6个儿子。父亲按事先写在一张纸上的数字把这堆苹果分完,每个人分到的苹果个数都不相同。他说:“老大,把你分到的苹果的1/8给老二,老二拿到后,连同原来的苹果分1/7给老三,老三拿到后,连同原来的苹果的1/6给老四,依此类推,最后老六拿到后,连同原来的苹果分1/3 给老大,这样,你们每个人分到的苹果就一样多了。” 问兄弟6人原先各分到多少只苹果?运行结果如图4.8所示。
二.算法分析:
(1)由题可知父亲用完这中方法后,各兄弟的苹果数已是平均数。故我们可通过这个平均数来反推过去,求出原本各兄弟的苹果数。设置一个变量为s=2520/6。
(2)我们得知道每人的原先苹果数与得到哥哥的苹果但还没分给弟弟时的苹果数。为什么呢?这两个数与s之间有联系,而且原先苹果数是我们所求的数字。所以我们可以分别设置两个数组来存这两个数(分别为x[ i ]与y[ i ])。其中,我们得知道这些兄弟里有一位是特殊的,那就是老大,他的x[ i ]与y[ i ]是相等的。
(3)由题可知,老二将他得到哥哥分的苹果后的总数的1/7分给老三后,他的苹果数便为平均数,所以可知y[ i ]*6/7=s;老三将他得到哥哥分的苹果后的总数的1/6分给老四后便为平均数,所以y[ i ]*5/6=s.......依此类推,可知从老二后,有一个规律,那就是y[ i ]=s*(8-i)/(7-i)(i>=1)。所以我们可以通过一个for循环语句来求出除老大外其他兄弟的y[ i ]。
(4)通过第三步后,我们也可以求出老大的y[ i ]。老大是先将自己的1/8苹果分给老二以及收到老六的1/6苹果后才为平均数,所以y[0]*7/8+y[5]*1/3=s。
(5)算出y[ i ]后,我们可以算出x[ i ]。他们之间有一个关系,就是y[ i ]等于x[ i ]加上从哥哥那得到的苹果。此处拿老二为例,y[1]=x[1]+y[1]*1/8。所以可得出一个公式x[i]=y[i]-y[i-1]/(9-i)。
(6)最后再利用一个for循坏语句将他们分别打印出。
三.程序代码:
#include<stdio.h>int main()
{//用来存储兄弟原本得到的苹果数int x[6]={0,};//用来存储从哥哥分到的苹果且还没分给弟弟时的苹果数(老大特例)int y[6]={0,};//s用来存储采用父亲的方法之后,各兄弟所得的平均苹果数int s,i;s=2520/6;//除老大外,其他兄弟从比自己大的兄弟那得到的苹果数for(i=1;i<6;i++) {y[i]=s*(8-i)/(7-i);}y[0]=x[0]=(s-y[5]/3)*8/7;//老大的苹果数//除老大外原先苹果数for(i=1;i<6;i++){x[i]=y[i]-y[i-1]/(9-i);}//输出每人的苹果数for(i=0;i<6;i++){printf("老%d原先的苹果数为%d\n",i+1,x[i]);}return 0;
}