有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。
等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”
请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。
如果有多个可能的答案,请列出所有答案,每个答案占一行。
格式是:人数,人数,...
等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”
请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。
如果有多个可能的答案,请列出所有答案,每个答案占一行。
格式是:人数,人数,...
例如,有一种可能是:20,5,4,2,0
/*
分析:
四瓶酒,最后一瓶时,人都倒下了。
4<=n<=20
n,a,c,d,e 分别代表船的人数,第一次喝醉的人,第二次喝醉的人,第三次喝醉的人,第四次喝醉的人
1/n+1/n-a+1/n-a-b+1/n-a-b-c
==1 这是判断船长喝了一瓶酒的条件
(n-a)*(n-a-b)*(n-a-b-c)+n*(n-a-b)*(n-a-b-c)+n*(n-a)*(n-a-b-c)+n*(n-a)*(n-a-b)
==n*(n-a)*(n-a-b)*(n-a-b-c) 上式的去分母得到的等式
还有就是a+b+c+d==n的判断
*/
#include<stdio.h>
int main()
{
int a,b,c,d,n;
for(n=4;n<=20;n++)
for(a=1;a<=(n-3);a++)
for(b=1;b<=(n-3);b++)
for(c=1;c<=(n-3);c++)
for(d=1;d<=(n-3);d++)
{
if(a+b+d+c==n&&((n-a)*(n-a-b)*(n-a-b-c)+n*(n-a-b)*(n-a-b-c)+n*(n-a)*(n-a-b-c)+n*(n-a)*(n-a-b)==n*(n-a)*(n-a-b)*(n-a-b-c))
)
printf("%d,%d,%d,%d,%d\n",n,n-a,n-a-b,n-a-b-c,0);
}
return 0;
}
这道题刚看时分析得时候少看了一个条件,就是船长刚好喝了一瓶的条件,最后条件缺失,得出的情况很多,
后来才知道题目看错了,在看题目的时候一定要读清题意。