分桔子的问题

   发布日期:2022-03-22 20:41:42    
如果用数学方法推导,也不难:



int iX[6];//六个孩子最初分到的桔子



(iX[0]*1/8+iX[1])*6/7=PER;

((iX[0]*1/8+iX[1])*1/7+iX[2])*5/6=PER;

(((iX[0]*1/8+iX[1])*1/7+iX[2

如果用数学方法推导,也不难:

int iX[6];//六个孩子最初分到的桔子

(iX[0]*1/8+iX[1])*6/7=PER;
((iX[0]*1/8+iX[1])*1/7+iX[2])*5/6=PER;
(((iX[0]*1/8+iX[1])*1/7+iX[2])*1/6+iX[3])*4/5=PER;
((((iX[0]*1/8+iX[1])*1/7+iX[2])*1/6+iX[3])*1/5+iX[4])*3/4=PER;
(((((iX[0]*1/8+iX[1])*1/7+iX[2])*1/6+iX[3])*1/5+iX[4])*1/4+iX[5])*2/3=PER;
(((((iX[0]*1/8+iX[1])*1/7+iX[2])*1/6+iX[3])*1/5+iX[4])*1/4+iX[5])*1/3+iX[0]*7/8=PER;

从最后两个式子往前推。由倒数第二式,可以得出:
(((((iX[0]*1/8+iX[1])*1/7+iX[2])*1/6+iX[3])*1/5+iX[4])*1/4+iX[5])=PER*3/2=630;
代入最后一式,可以求得iX[0]:
iX[0]=(PER-630*1/3)*8/7=(420-210)*8/7=240;

然后,再从第一个式子往后推:
iX[1]=PER*7/6-240*1/8=490-30=460;
iX[2]=PER*6/5-490*1/7=504-70=434;
iX[3]=PER*5/4-504*1/6=525-84=441;
iX[4]=PER*4/3-525*1/5=560-105=455;
iX[5]=PER*3/2-560*1/4=630-140=490;

我在你的程序基础上修改了一下:
#include<iostream>
using namespace std;

const int TOTAL=2520;
const int PER=TOTAL/6;
void main()
{
int iX[6];//六个孩子最初分到的桔子

for (iX[0]=1;iX[0]<TOTAL;iX[0]++)//老大的桔子的变化范围
{
for (iX[1]=1;iX[1]<TOTAL-iX[0];iX[1]++)//老二的桔子的变化范围
{
for (iX[2]=1;iX[2]<TOTAL-iX[0]-iX[1];iX[2]++)//老三的桔子的变化范围
{
for (iX[3]=1;iX[3]<TOTAL-iX[0]-iX[1]-iX[2];iX[3]++)//老四的桔子的变化范围
{
for (iX[4]=1;iX[4]<TOTAL-iX[0]-iX[1]-iX[2]-iX[3];iX[4]++)//老五的桔子的变化范围
{
iX[5]=TOTAL-iX[0]-iX[1]-iX[2]-iX[3]-iX[4];
//for (iX[5]=1;iX[4]<total;iX[5]++)//老六的桔子的变化范围
{
int iSum[6],i,tmp;
//cout<<iX[0]<< <<iX[1]<< <<iX[2]<< <<iX[3]<< <<iX[4]<<endl;
///*
for(i=0;i<6;i++)
{
iSum[i]=iX[i];
}
{////下面这段可以写成循环
tmp=iSum[0]*1/8;
iSum[0]=iSum[0]-tmp;
iSum[1]+=tmp;

tmp=iSum[1]*1/7;
iSum[1]=iSum[1]-tmp;
iSum[2]+=tmp;

tmp=iSum[2]*1/6;
iSum[2]=iSum[2]-tmp;
iSum[3]+=tmp;

tmp=iSum[3]*1/5;
iSum[3]=iSum[3]-tmp;
iSum[4]+=tmp;

tmp=iSum[4]*1/4;
iSum[4]=iSum[4]-tmp;
iSum[5]+=tmp;

tmp=iSum[5]*1/3;
iSum[5]=iSum[5]-tmp;
iSum[0]+=tmp;
}

if(iSum[0]==PER&&iSum[1]==PER&&iSum[2]==PER
&&iSum[3]==PER&&iSum[4]==PER&&iSum[5]==PER)
{
for (i=0;i<6;i++)
{
cout<<iX[i]<< ;
}
cout<<endl;
}
// */
}
}
}
}
}
}
cout<<OVER<<endl;
cin.get();
}
这个程序应该也是有输出的,但很耗时!
我在程序的最后,加了两句,一句是打印出一个OVER,一句是停下来等待输入。
也许等很久很久以后,会看到输出的吧。反正,我等了很久很久,它还在算。

再加一些条件,让它尽快把不合理的情况排除掉,这样就能很快算出结果了
程序如下:
#include<iostream>
using namespace std;

const int TOTAL=2520;
const int PER=TOTAL/6;
void main()
{
int iX[6];//六个孩子最初分到的桔子

for (iX[0]=1;iX[0]<TOTAL;iX[0]++)//老大的桔子的变化范围
{
for (iX[1]=1;iX[1]<TOTAL-iX[0];iX[1]++)//老二的桔子的变化范围
{
if((iX[0]*1/8+iX[1])*6/7!=PER)
{
continue;
}
for (iX[2]=1;iX[2]<TOTAL-iX[0]-iX[1];iX[2]++)//老三的桔子的变化范围
{
if(((iX[0]*1/8+iX[1])*1/7+iX[2])*5/6!=PER)
{
continue;
}
for (iX[3]=1;iX[3]<TOTAL-iX[0]-iX[1]-iX[2];iX[3]++)//老四的桔子的变化范围
{
if((((iX[0]*1/8+iX[1])*1/7+iX[2])*1/6+iX[3])*4/5!=PER)
{
continue;
}
for (iX[4]=1;iX[4]<TOTAL-iX[0]-iX[1]-iX[2]-iX[3];iX[4]++)//老五的桔子的变化范围
{
if(((((iX[0]*1/8+iX[1])*1/7+iX[2])*1/6+iX[3])*1/5+iX[4])*3/4!=PER)
{
continue;
}
iX[5]=TOTAL-iX[0]-iX[1]-iX[2]-iX[3]-iX[4];

if((((((iX[0]*1/8+iX[1])*1/7+iX[2])*1/6+iX[3])*1/5+iX[4])*1/4+iX[5])*2/3!=PER)
{
continue;
}
if((((((iX[0]*1/8+iX[1])*1/7+iX[2])*1/6+iX[3])*1/5+iX[4])*1/4+iX[5])*1/3+iX[0]*7/8!=PER)
{
continue;
}

for (int i=0;i<6;i++)
{
cout<<iX[i]<< ;
}
cout<<endl;
}
}
}
}
}
cout<<OVER<<endl;
cin.get();
}

 
 
免责声明: 如果本站所选内容的文章作者及编辑认为其作品涉及版权问题,请及时用电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
本站未注明稿件来源:我爱网的图/文等稿件,均来自于互联网,目的在于传递更多行业信息,并不代表本站的立场和观点,仅供参考。他人从本网转载需自负版权等法律责任。本站部分内容来源于互联网,如有侵犯您的版权,请联系我们及时更正或删除。

推荐知识
点击排行
本站暂时不做友情链接,请勿申请!
友情链接