浮点数的注意事项和海盗喝酒问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xckkcxxck/article/details/79464044

不要进行浮点数的全等比较。

当写出以下式子时,if(0.1+0.2 == 0.3) return true;else return false

会发现结果是return false;这就是因为计算机内部的二进制的问题。我就不细研究了,因为我也不太懂。但是有两种解决方法,一种是做差然后求绝对值与一个极小的数字进行比较,比如1e-10,小于它说明就可以了。另一种是通过数学上的通分等方法将小数或者分式转化为整数。这样就可以了

问题:海盗喝酒问题

有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒, 

所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的, 

再次重复…… 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。 

当第4瓶酒平分喝下后,大家都倒下了。 等船长醒来,发现海盗船搁浅了。 

他在航海日志中写到:“……昨天,我正好喝了一瓶…….奉劝大家,开船不喝酒,喝酒别开船……” 

请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。 

如果有多个可能的答案,请列出所有答案,每个答案占一行。 

格式是:人数,人数,… 

代码:

public class Main{
	public static void main(String[] args) {
		for (int a=20; a>=1; a--)
			for (int b=a-1; b>=1; b--)
				for(int c=b-1; c>=1; c--)
					for(int d=c-1; d>=1; d--) {
						if (b*c*d + a*c*d + a*b*d + a*b*c == a*b*c*d) {
							System.out.println(a+","+b+","+c+","+d);
						}
					}
	}
}

思路:这个题的思路也很简单,我们就考虑海盗船长一个人,假设这四瓶酒喝的人的数量分别是a,b,c,d, 那么很容易想到海盗船长喝的为 1/a + 1/b + 1/c + 1/d ==1,这就是判断条件,但是要注意这里是分数,所以我把它通分,转化为了整数式子。

猜你喜欢

转载自blog.csdn.net/xckkcxxck/article/details/79464044
今日推荐