一个简单的算法问题.....class SM
{
public static void main(String[] args)
{
double a=0.0,b=0.0,c=0.0,d=0.0;
System.out.println("Result as fallows:");
//for part-----------------------------------------------------------
System.out.println(" --for--");
for(a=0.0;a<=8.0;a+=0.5)
{
for (b = 0.0; b <= 8.0; b += 0.5)
{
for (c = 0.0; c <= 8.0; c += 0.5)
{
d = 8.0 - a - b - c;
if (a * b * c * d == 8.0 && a + b + c + d == 8.0)
{
System.out.print("==>>: ");
System.out.println("a=" + a + ",b=" + b + ",c=" + c + ",d=" + d);
//System.exit(0);
}
}
}
}
//while part-----------------------------------------------------------
System.out.println(" --while--");
a = 0.0;
数据挖掘交友 while (a <= 8.0)
{
b = 0.0;
while(b <= 8.0)
{
c = 0.0;
while(c <= 8.0)
{
d = 8.0 - a - b - c;
if (a * b * c * d == 8.0 && a + b + c + d == 8.0)
{
System.out.print("==>>: ");
System.out.println("a=" + a + ",b=" + b + ",c=" + c + ",d=" + d);
System.exit(0);
}
c+=0.1;
}
b+=0.1;
}
a+=0.1;
}
}
}
上面代码都是想要找出abcd的和与积都等于8的四个数
就好像 1 1 2 4 四个数 1+2+1+4=1*2*1*4=8
但是出现一个问题就是:
无论用for还是while循环,当a+=1.0步进和a+=0.5 0.25 步进
(也就是for(a=0.0;a<=8.0;a+=0.5){})
都可以求出结果就是
a=1.0,b=1.0,c=2.0,d=4.0 以及位置互换,
但如果将步进改成0.2 或 0.1 就得不到结果..这是为什么??
在C++里也是同样的问题!!救救...........
数据挖掘交友
以步进0.2 为例...如果每次判断和积时都输出abcd,
发现输出为(其中一个)a=7.80000000004,b=7.8000000004,c=7.8000000004,d=-15.40000000000013
这又是为什么??
将约束条件改成a<=8.0 b<=8.0-a c<=8.0-a-b 还是一样..
会出现一个小数点后若干位的误差! double型存在误差
因为在计算机中二进制表示浮点数时会出现误差是难免的
尤其在各种算术运算中
你可以换一个
用java.math.BigDecimal类进行精确的浮点数操作就不会出错了
|