这题真的没什么可说的,做不出来还讲什么理由?!
看了分析,写了代码,练习的两个测试用例都正确,不过不是最优化的方案,属于分析中讲到的小数据集的解决办法。。。
接着优化,利用GCD的方法分析中说的很明白,具体代码可以看排名第三的Myth的代码,真短啊。。。
上面的程序w * 100 == d * pd这里,因为d * pd / 100 == w如果成立,则一定有 d * pd % 100 == 0, 所以去掉里面的循环,写成这样:
else {
flag = 0;
for(int d = 1; d <= n; d++) //if n>100,
if(d * pd % 100 == 0) {flag = 1; break;} // d * pd / 100 is integer, so d * pd % 100 is apparently 0
}
因为如果n>100的话,d == 100时一定成立,所以不管n多么大,循环最多运行100次,又一个trick啊,囧!
再批评自己一下:
看到percentage就要用double?脑袋进水了吧?
double本来就不精确,取整或者四舍五入都会造成误差,这怎么用来求整数解?!
most stupid among 4000+ coders!根本就不去分析,胡乱的在写代码,要是能对就见了鬼了。。。
看一个代码片段,出处是一个csdn的帖子:
d = 9.499999999999999999999999999999999999; /* d = 9.500000000000000, i = 9, j = 10 */
d = 9.499; /* d = 9.499000000000001, i = 9, j = 9 */
printf("d = %.15f/n", d);
i = (int)(d);
j = (int)(d + 0.5);
double只能精确表示小数点后15位,第十六位的数字会四舍五入,所以第一个d变成了9,5,第二个d第16位是5,所以第15位会有个1