测试结果1: 测试结果错误.错误结果为:500000000500000
正确结果应为:500000001500000
测试结果2: 测试结果错误.错误结果为:50000000050000000
正确结果应为:49999999950000000
测试结果3: 通过本测试点|有效耗时47ms
测试结果4: 测试结果错误.错误结果为:500000000500
正确结果应为:499999999500
测试结果5: 通过本测试点|有效耗时47ms
测试结果6: 测试结果错误.错误结果为:50000000050000
正确结果应为:49999999950000
测试结果7: 通过本测试点|有效耗时47ms
测试结果8: 通过本测试点|有效耗时47ms
测试结果9: 测试结果错误.错误结果为:50000000050
正确结果应为:50000000150
测试结果10: 测试结果错误.错误结果为:50000000050
正确结果应为:49999999950
提交代码:
01.program p640;
02.const MAX=1000000000;
03.var str:string;
04.i,k:longint;
05.begin
06.readln(str);
07.k:=1;
08.for i:=1 to length(str)-2 do k:=k*10;
09.writeln((MAX+1)*MAX div 2 div k);
10.end.
不是求平均数,是求近似解。
拿0.05举例,能得到这个结果的范围必定是0.045~0.05444…,范围总共的大小是0.01.
而对于任何一个分母N,分子每次变化(加或者减)的范围是1/N。
0.01/(1/N)就是这个分母所有可行的分子个数(当然有1到2个的出入)。
化简以后就是0.01*N,从1累加到1000000000就是乘法分配律再等差数列求和。
但是因为每个数据都不是精确的,虽然能互相补,但是结果肯定也不精确,尤其是对于分母小的情况。
(为了避免实型,我把0.00…1换成了div 100…0)
我本来以为误差很大的,没想到还对了几个,而且错的几个很有规律。
状态: Unaccepted
测评机: Xeost[5]
得分: 40分
提交日期: 2011-8-28 16:00:00
有效耗时: 187毫秒
测试结果1: 测试结果错误.错误结果为:499999999500000
正确结果应为:500000001500000
测试结果2: 测试结果错误.错误结果为:50000000150000000
正确结果应为:49999999950000000
测试结果3: 通过本测试点|有效耗时47ms
测试结果4: 测试结果错误.错误结果为:500000001500
正确结果应为:499999999500
测试结果5: 通过本测试点|有效耗时47ms
测试结果6: 测试结果错误.错误结果为:50000000150000
正确结果应为:49999999950000
测试结果7: 通过本测试点|有效耗时47ms
测试结果8: 通过本测试点|有效耗时46ms
测试结果9: 测试结果错误.错误结果为:49999999950
正确结果应为:50000000150
测试结果10: 测试结果错误.错误结果为:50000000150
正确结果应为:49999999950