gpt4 book ai didi

c# - 在 C# 整数运算中,a/b/c 是否总是等于 a/(b*c)?

转载 作者:IT王子 更新时间:2023-10-29 03:38:46 25 4
gpt4 key购买 nike

令 a、b 和 c 为非大正整数。 a/b/c 在 C# 整数运算中是否总是等于 a/(b * c)?对我来说,在 C# 中它看起来像:

int a = 5126, b = 76, c = 14;
int x1 = a / b / c;
int x2 = a / (b * c);

所以我的问题是:x1 == x2 是否适用于所有 a、b 和 c?

最佳答案

我非常喜欢这个问题,所以我把它作为了 my blog on June 4th, 2013 的主题.感谢您提出很好的问题!


大箱子来之不易。例如:

a = 1073741823; 
b = 134217727;
c = 134217727;

因为b * c溢出为负数。

我要补充的是,在校验算术中,a / (b * c) 之间的区别和 (a / b) / c可能是运行的程序和崩溃的程序之间的区别。如果 b 的产品和 c溢出整数的边界,那么前者将在检查的上下文中崩溃。

对于小的正整数,比如说,小到足以放入一个短的,恒等式应该被保持。


Timothy Shields 刚刚发布了一份证明;我在这里提出另一种证明。假设这里的所有数字都是非负整数,并且没有任何操作溢出。

x / y的整数除法找到值 q这样 q * y + r == x , 其中0 <= r < y .

所以划分a / (b * c)找到值 q1这样

q1 * b * c + r1 == a

哪里0 <= r1 < b * c

( a / b ) / c首先找到值 qt这样

qt * b + r3 == a

然后找到值 q2这样

q2 * c + r2 == qt

因此将其替换为 qt我们得到:

q2 * b * c + b * r2 + r3 == a

哪里0 <= r2 < c0 <= r3 < b .

两个相等的事物彼此相等,所以我们有

q1 * b * c + r1 == q2 * b * c + b * r2 + r3

假设 q1 == q2 + x对于某个整数 x .代入并求解 x :

q2 * b * c + x * b * c + r1 = q2 * b * c + b * r2 + r3
x = (b * r2 + r3 - r1) / (b * c)

在哪里

 0 <= r1 < b * c
0 <= r2 < c
0 <= r3 < b

可以x大于零?不,我们有不平等现象:

 b * r2 + r3 - r1 <= b * r2 + r3 <= b * (c - 1) + r3 < b * (c - 1) + b == b * c

所以那个分数的分子总是小于b * c , 所以 x不能大于零。

可以x小于零?否,通过类似的论证,留给读者。

因此整数 x为零,因此 q1 == q2 .

关于c# - 在 C# 整数运算中,a/b/c 是否总是等于 a/(b*c)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16837854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com