其他分享
首页 > 其他分享> > 海盗与金币

海盗与金币

作者:互联网

海盗与金币 JAVA大学C组

12名海盗在一个小岛上发现了大量的金币,后统计一共有将近5万枚。
登上小岛是在夜里,天气又不好。由于各种原因,有的海盗偷拿了很多,有的拿了很少。
后来为了“均贫富”,头目提出一个很奇怪的方案:
每名海盗都把自己拿到的金币放在桌上。然后开始一个游戏。
金币最多的海盗要拿出自己的金币来补偿其他人。
补偿的额度为正好使被补偿人的金币数目翻番(即变为原来的2倍)。
游戏要一直进行下去,直到无法完成。
(当金币数最多的不只一个人或最多金币的人持有金币数不够补偿他人的)

游戏就这样紧张地进行了,一直进行了12轮,恰好每人都“放血”一次,
更离奇的是,刚好在第12轮后,每个人的金币数居然都相等了!! 这难道是天意吗?

请你计算,游戏开始前,所有海盗的初始金币数目,从小到大排列,中间有一个空格分开。

答案形如:
13 25 49 97 193 385 769 1537 3073 6145 12289 24577
当然,这个就是(正确答案)!!!划重点 要考的~

注意:
需要提交的是一行空格分开的整数,不要提交任何多余的内容。
分隔符要用一个西文的空格,不要用其它符号(比如逗号,中文符号等)
下面是我得JAVA解法,欢迎指正!!
在这里插入代码片

	public static void main(String[] args) {
		// 12名海盗
		int[] cold = new int[12];
		// 有五万枚金币
		for (int i = 12; i < 50000; i += 12) {
			// 12轮之后的结果
			for (int j = 0; j < 12; j++) {
				cold[j] = i / 12;
			}
			// 最后一个是最大的
			coin(cold, 11, i);
		}
	}
	// num是金币数,max是当前金币最多的那个人,sum为总金币数。
	public static void coin(int[] num, int max, int sum) {
		// 如果金币小于0,退出循环
		if (max < 0) {
			for (int i = 11; i >= 0; i--) {
				System.out.print(num[i] + " ");
			}
			return;
		}
		//计算一个次数循环
		int count = 0;
		// 大于12轮且金币等于最多的人时,跳出循环一次
		for (int i = 0; i < 12; i++) {
			if (i == max) {
				continue;
			} else {
				// 如果海盗的金币模除2不等于0就退出循环
				if (num[i] % 2 != 0) {
					return;
				} else {
					//金币数量补偿到它原来的两倍,逆推
					num[i] = num[i] / 2;
					//循环到12时,结束。
					count += num[i];
				}
			}
		}
		//金币最大数量等于总金币数-海盗每次出血数
		num[max] = sum - count;
		//max-1是因为第十二次就已经平分结束,直接输出结果就可以了。
		coin(num, max - 1, sum);
	}
}


高聪明 发布了1 篇原创文章 · 获赞 0 · 访问量 5 私信 关注

标签:海盗,12,int,max,金币,num
来源: https://blog.csdn.net/weixin_43771695/article/details/104131313