各位兄弟,帮忙看下这个思考题,求桔子数有关问题
各位兄弟,帮忙看下这个思考题,求桔子数问题.
今日 活动下找了个思考题来做:
题目如下:
*思考题
日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完后父亲说
:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的
桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;
老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多
少桔子?
分析:
int sum = 2520 //桔子总数
int avge = 420; // 2520/6 最后平均数 = 420
int a[6];//保存6个兄弟数
这里我用试探法来做
设置 a[0] = 某个数;
那么 (a[1] - a[0]/8)*(6/7) = 420 转换下 a[0]= avge *(7/6) + a[0]/8
a[2] = 420*(6/5)+ [a1]/7;
得出公式如下 a[j] = 420*( (8-j)/(8-j-1) ) + a[j-1]/(8-j+1);
到最后 a[0] = a[0]*7/8+a[5]/3 =420 时 a[0]即满足要求 输出a[0],a[1].......
代码如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int sum = 2520;
int avge = 2520/6;
int a[6] = {0} ;
int b =1; //用于中断循环
int momey= 0;
//试探法
for( int i = 1 ; b && (i < sum) ; i++)
{
a[0] = i; //1号
if((a[0]%8)!=0) //要保证其为整数,过滤掉不能被8整除的数
{
continue;
}
for( int j = 1; j <= 5 ; j++)
{
a[j] = avge*((8-j)/(8-j-1))+a[j-1]/(8-(j-1)); //剩下弟兄的值
if( j == 5)
{
momey = (a[0]*7)/8+a[j]/3; //看第一位的值符合要求吗?
if(momey == avge)
{
b = 0;
}
}
}
}
printf("%d,%d,%d,%d,%d,%d",a[0],a[1],a[2],a[3],a[4],a[5]);
system("pause");
return 0;
}
但我最后输出结果为: 2519,734,524,507,521,550
明显是错的,但我上面那里出错了啊,怎么试探不出正确值啊.
------解决方案--------------------
你这试探没看懂,挺简单的一个题:
今日 活动下找了个思考题来做:
题目如下:
*思考题
日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完后父亲说
:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的
桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;
老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多
少桔子?
分析:
int sum = 2520 //桔子总数
int avge = 420; // 2520/6 最后平均数 = 420
int a[6];//保存6个兄弟数
这里我用试探法来做
设置 a[0] = 某个数;
那么 (a[1] - a[0]/8)*(6/7) = 420 转换下 a[0]= avge *(7/6) + a[0]/8
a[2] = 420*(6/5)+ [a1]/7;
得出公式如下 a[j] = 420*( (8-j)/(8-j-1) ) + a[j-1]/(8-j+1);
到最后 a[0] = a[0]*7/8+a[5]/3 =420 时 a[0]即满足要求 输出a[0],a[1].......
代码如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int sum = 2520;
int avge = 2520/6;
int a[6] = {0} ;
int b =1; //用于中断循环
int momey= 0;
//试探法
for( int i = 1 ; b && (i < sum) ; i++)
{
a[0] = i; //1号
if((a[0]%8)!=0) //要保证其为整数,过滤掉不能被8整除的数
{
continue;
}
for( int j = 1; j <= 5 ; j++)
{
a[j] = avge*((8-j)/(8-j-1))+a[j-1]/(8-(j-1)); //剩下弟兄的值
if( j == 5)
{
momey = (a[0]*7)/8+a[j]/3; //看第一位的值符合要求吗?
if(momey == avge)
{
b = 0;
}
}
}
}
printf("%d,%d,%d,%d,%d,%d",a[0],a[1],a[2],a[3],a[4],a[5]);
system("pause");
return 0;
}
但我最后输出结果为: 2519,734,524,507,521,550
明显是错的,但我上面那里出错了啊,怎么试探不出正确值啊.
------解决方案--------------------
你这试探没看懂,挺简单的一个题:
- C/C++ code
#include <stdio.h> #include <stdlib.h> int main() { int avge = 2520/6; int a[6] = {0}; int left = 0; for( int i=0; i<6; i++) { if (i==0) { //老大的是老六最后给了1/3,也就是420*1/2 = 210个 a[i] = (avge-210)*(8-i)/(7-i) - left; left = a[i] + left - (avge-210); } else { a[i] = avge*(8-i)/(7-i) - left; left = a[i] + left - avge; } } printf("%d,%d,%d,%d,%d,%d\n",a[0],a[1],a[2],a[3],a[4],a[5]); system("pause"); return 0; }
------解决方案--------------------
这题目还需要编程来实现啊?
倒推就可以了:
总共2520,分到最后没人是2520/6=420
老六拿到后连同原先的桔子分1/3给老大,所以老六没分给老大之前是420*3/2=630,分给老大的是630/3=210;
老大最后也是420,所以老大在分给老二后的橘子数为420-210=210;
而老大将分给你的桔子的1/8给老二,故老大未分给老二前的橘子数为210*8/7=240;
老二拿到后连同原先的桔子分1/7给老三,设老二本身的橘子树为x,则(x+30)*6/7=420;老二本身的橘子数为460;
....
以此类推!