Adi*_*eya 12 integer-division operator-precedence associativity rust
我有以下功能:
pub fn s_v1(n: &u64) -> u64 {
let mut x: u64 = 1;
for i in 1..=*n {
x = x * (*n + i) / i;
}
x
}
Run Code Online (Sandbox Code Playgroud)
这段代码给出了正确的答案s_v1(&20) == 137846528820
但是,如果我将 for 循环中的行更改为x *= (*n + i) / i;
答案改为s_v1(&20) == 16094453760
为什么结果不同?不是x = x * y
一样吗x *= y
?
Cha*_*man 33
因为*
和/
与左结合性具有相同的优先级,所以该表达式不是
x * ((*n + i) / i)
Run Code Online (Sandbox Code Playgroud)
(与 相同x *= (*n + i) / i
)但是
(x * (*n + i)) / i
Run Code Online (Sandbox Code Playgroud)
Mar*_*ley 11
正如其他人指出的,有两个因素:
a*=b/c
相当于a=a*(b/c)
而不是a=a*b/c
(这是隐式的)a=(a*b)/c
。/
表示根据操作数的类型进行划分。在这种情况下,操作数都是整数,因此/
表示丢弃任何余数的整数除法,因此(a*b)/c
与不同a*(b/c)
(除非b
是 的精确倍数c
)。如果要替换循环中的行,则需要拆分两个操作:
for i in 1..=*n {
x *= *n + i;
x /= i;
}
Run Code Online (Sandbox Code Playgroud)
该算法的一个缺点是,当答案应在 MAXINT/2n 和 MAXINT 之间时,它不会产生正确的结果。为此,您实际上需要利用您尝试做的事情:
for i in 1..=*n {
if (x % i == 0) {
x /= i;
x *= *n + i;
} else if (*n % i == 0) {
x *= *n / i + 1;
} else {
x *= *n + i;
x /= i;
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3749 次 |
最近记录: |