这题分苹果的题目请大家帮帮忙

有苹果若干,按以下方法分给五个大人和一位小孩.
先由第一人将苹果均分为5堆,多余的一个给小孩,自己取其中的一堆.第二人
又将剩下的苹果均分为5堆,多余一个给小孩,自己取其中的一堆.第三、四、五人
同样均分,多余一个给小孩,每人各取其中一堆。问原先最少有多少苹果?五个
大人各得多少苹果?
设第i次均分前有Yi个苹果,均分后某人取走Xi个,剩下Yi+1个,则有以下
递推式:
Xi+1=(Yi-1)/5
Yi+1=4Xi+1 i=0,1,2,....5

Input



Output

原先最少有几个苹果数目(空三格)第一人得苹果数(空三格)第二人得苹果数(空三格)第三人得苹果数(空三格)第四人得苹果数(空三格)第五人得苹果数(并换行回车)

Sample Input


Sample Output

6246 1249 999 799 639 511
(该解只是一个可能解)

/*******************************************************
*此题可以使用逆向思维,分析如下:
*假设最后一个人取了num个苹果(也就是第5个人取的苹果数)
*那么第5个人取的时候还剩下(num*5+1)个苹果
*由此,可推出第4个人取的苹果数为(num*5+1)/4
*那么第4个人取的时候还剩下((num*5+1)/4)*5+1个苹果
*由此类推,可得最后答案,请看如下实现的程序
******************************************************/
#include<stdio.h>
void main()
{
const int boyNum=1;//最后剩下的留给小孩的那个苹果
unsigned int m=1;
unsigned int num;
unsigned int allNum;//苹果总数
int i=0,j=0;
while(m < (1<<15))//考虑allNum溢出的问题,不适合较大的数
{
while(i<4)
{
num = m;
for(;i<4;i++)
{
allNum = num*5+boyNum;
if((allNum%4) != 0)
{
i=0;//重新开始循环
break;

}
num = allNum>>2;//即除以4
}
m++;
}
allNum = num*5+boyNum;
printf("第%d组答案:",j+1);
printf("%u",allNum);
for(i=0;i<5;i++)
{
allNum = (allNum-boyNum)/5;
printf(" %u",allNum);
allNum = allNum*4;
}
printf("\n");
i=0;
j++;
}
}

//方案二:正常思维
#include<stdio.h>
void main()
{
const int boyNum=1;//最后剩下的留给小孩的那个苹果
unsigned int allNum = 1;//苹果总数,预设为6
unsigned int num,m;
int i=0,j=0;
while(allNum < (1<<15))//在allNum没有溢出前的所有答案
{
num = allNum;
i=0;
for(;i<5;i++)
{
m = (num-boyNum)%5;
if(m != 0)
{
i=0;
break;
}
num = (num-boyNum)/5;
/* if(num == 0)//可以不需要,因为这种情况很少,而且会被if(m != 0) 排除掉,在此影响效率
{
i=0;
break;
}*/
num = num*4;
}
if(i>=4)
{
j++;
printf("第%d组答案:",j);
printf("%u",allNum);
num = allNum;
for(i=0;i<5;i++)
{
num = (num-boyNum)/5;
printf(" %u",num);
num = num*4;
}
printf("\n");
}
allNum++;
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-08-13
LZ 是否是需要输出所有的可能解,然后在找出最优解啊?
楼上的,请不要输出错解
第2个回答  2008-08-13
这是输出最后一个人拿小于100000个苹果时的解

#include<iostream>

using namespace std;

int check(int c)
{
if((c*5 +1)%4==0)return (c*5 +1)/4;
//if((((c<<2)+c+1)&3)==0)return ((c<<2)+c +1)>>2;
return 0;
}

#define PEOPLE 5

int main()
{
int i , j , k[PEOPLE];
for(i = 0 ; i < 100000 ; i++)
{
bool flag = true;
k[0] = i;
for(j = 1; j< PEOPLE ; j++)
{
k[j] = check(k[j-1]);
if(!k[j])
{
flag = false;
break;
}
}

if(flag)
{
cout << k[PEOPLE - 1]*5+1 << " ";
for(j = PEOPLE - 1 ; j >= 0 ; j-- )
cout << k[j] << " ";
cout << endl;
}
}

return 0;
}