6
回答
【Java程序设计】-海盗比酒量问题,求帮助!
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”
请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。
如果有多个可能的答案,请列出所有答案,每个答案占一行。
格式是:人数,人数,...

例如,有一种可能是:20,5,4,2,0。

程序运行复杂程度和算法提示!

<无标签>
举报
MisterZou
发帖于5年前 6回/1K+阅
共有6个答案 最后回答: 4年前
实际上就是求1/a+1/b+1/c+1/d=1的所有可能的正整数解,其中20>=a>b>c>d>0,4个循环就可以了
--- 共有 3 条评论 ---
excepiton公式和我想的一样。。。 abc+abd+acd+bcd=abcd 20>=a>b>c>d>0 4层循环枚举就可以 5年前 回复
leo108回复 @MisterZou : 船长正好喝了一瓶,每瓶酒都是平分喝 5年前 回复
MisterZou1/a+1/b+1/c+1/d=1,这个等式是怎么提取出来的呢? 5年前 回复
4,0,0,0,4
6,0,0,4,2
6,0,3,0,3
6,2,0,1,3
8,0,4,2,2
10,5,0,3,2
12,0,9,1,2
12,6,2,2,2
12,8,1,0,3
15,5,7,1,2
18,9,6,1,2
20,15,1,2,2
//a,b,c,d分别是四轮喝酒的人数,那么船长喝酒的总数是
//1/a + 1/b + 1/c + 1/d = 1瓶,变换一下就是
//b*c*d + a*c*d + a*b*d + a*b*c = a*b*c*d 此条件成立即可
//使用方式命令行输入[a.out 20]
#include <stdio.h>
#include <stdlib.h>

int istrue(int a, int b, int c, int d)
{
    return  a*b*c*d == b*c*d+a*c*d+a*b*d+a*b*c;
}

int main(int argc, char *argv[])
{
    int a, b, c, d = 0;
    int count = 0;
    int total = 0;
    total = atoi(argv[1]);//第一轮喝酒人数上限
    
    for (a = 1; a <= total; a++) {//每下一轮喝酒人数不能超过上一轮
        for (b = 1; b <= a; b++) {
            for (c = 1; c <= b; c++) {
                for (d = 1; d <= c; d++) {
                    count++;//算法总共运算次数
                    if (istrue(a,b,c,d)) {
                        printf("%d,%d,%d,%d\n", a,b,c,d);
                    }
                }
            }
        }
    }
    printf("count = [%d]\n", count);
    return 0;
}
 $ ./a.exe 20
4,4,4,4
6,4,4,3
6,6,3,3
6,6,6,2
8,8,4,2
10,5,5,2
12,4,3,3
12,6,4,2
12,12,3,2
15,10,3,2
18,9,3,2
20,5,4,2
count = [8855]
--- 共有 2 条评论 ---
Michael_Yuan回复 @MisterZou : 我理解倒下0个人也是合理的。 如果认为倒下0个人不合理,把<=改成<即可。 5年前 回复
MisterZou这个程序不一定正确,因为题目中每一轮都有人倒下。 5年前 回复
public class Main {

	public static void main(String[] args){
		int a,b,c,d;
		for(a=20;a>0;a--){
			for(b=3;b<a;b++){
				for(c=2;c<b;c++){
					for(d=1;d<c;d++){
						if((Math.abs((1.0/a+1.0/b+1.0/c+1.0/d)-1))<0.0000001) 
						System.out.println(a+" "+b+" "+c+" "+d+" "+0);
					}
				}
			}
		}
	}
}

/*
20 5 4 2 0
18 9 3 2 0
15 10 3 2 0
12 6 4 2 0
*/
顶部