第4天打卡
/*海盗比酒量
有一群海盗(不多于20人),在船上比拼酒量。过程如下:
打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。
再打开一瓶酒平分,又有倒下的,再次重复…
直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。
当第4瓶酒平分喝下后,大家都倒下了。
等船长醒来,发现海盗船搁浅了。
他在航海日志中写到:"…昨天,我正好喝了一瓶…奉劝大家,开船不喝酒,喝酒别开船…"
请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。
如果有多个可能的答案,请列出所有答案,每个答案占一行。
格式是:人数,人数,…
例如,有一种可能是:20,5,4,2,0
*/
#include<iostream>
using namespace std;
int main()
{
double a,b,c,d;
for(int i=1;i<=20;i++)//不多于20人,第一轮
{
a=1.0/i;
for(int j=1;j<i;j++)//第二轮
{
b=1.0/j;
for(int x=1;x<j;x++)//第三轮
{
c=1.0/x;
for(int y=1;y<x;y++)//第四轮
{
d=1.0/y;
if((a+b+c+d)==1)//判断四轮下来,船长喝的是否为1
cout<<i<<","<<j<<","<<x<<","<<y<<","<<"0"<<endl;
}
}
}
}
return 0;
}
思路:因为船长喝了四轮(满轮),而且正好喝完一瓶。所以,四次喝的都是一个分数,它们相加为1。
错误点:1.一开始设置的五个循环(因为有四轮,想着四次挑选),但后来发现这样是多此一举;2.值的确定问题,后一轮的数量肯定要比第一轮的数量要少,是小于,而不是小于等于;3.因为喝的是一个分数,而人数是一个整数,所以要注意类型转换,“/”号前如果是整型就是整除,如果是浮点型就是除。根据前面的数字来判断;4.注意最后输出的是人数。