蒟蒻发现了一个无聊的问题

P1618 三连击(升级版)

TommyBay @ 2020-02-04 18:56:25

已知以下数学等式成立:

\frac{x}{a}= \frac{y}{b}

在问题P1618中,已知比例a和b,暴力枚举x,得到y,那么数学公式应该为:

y= \frac{xb}{a}

可是我发现C语言中,以下三种写法的效果是不同的:

int y=x*b/a;
int y=x/a*b;
int y=b/a*x;

当a==123,b==456时,只有第一种可以正确AC(走运飘过),第二种会多一个x==132的错误情况,第三种则No!!!。 才开始学C语言,这是怎么回事?求大犇们指导一下到底是怎么回事,谢谢。


by 死神审判 @ 2020-02-04 19:01:14

@bigheadcat 按照运算顺序,当然2,3不对了。


by WYXkk @ 2020-02-04 19:04:03

@bigheadcat 因为 C/C++ 中 整数/整数 自动下取整,所以后两种先除会炸。。。


by WYXkk @ 2020-02-04 19:04:55

比如 2*3/5 得到 12/5*3 得到 0


by 死神审判 @ 2020-02-04 19:10:25

@bigheadcat 这是int类型,会有误差。


by TommyBay @ 2020-02-04 21:53:52

@死神审判 谢谢大哥。我还想问一下,这三种顺序都是整型相除,是不是说依然存在漏洞?


by TommyBay @ 2020-02-04 21:55:05

@WYXkk 谢谢大哥。我还想问一下,这三种顺序都是整型相除,是不是说依然存在漏洞?也就是说,这种办法并不是完美的,如果本题数据加强,则依然无法通过。


by 死神审判 @ 2020-02-04 21:55:10

@bigheadcat 是的


|