Algorithm 实现之间的差异?
所以最近我偶然发现了一个问题,即 代码1:Algorithm 实现之间的差异?,algorithm,debugging,Algorithm,Debugging,所以最近我偶然发现了一个问题,即 代码1: for(long i = 1; i <= m; i++) { long j = (fullsum - 2*(sum -i))/2; if(j >= m+1 && j <=n) { swaps++; } } 对于(长i=1;i=m+1&&j)重写如果(sum-i+j==fullsum-sum-j+i),我们得到 if(2*j == fullsum - 2*(sum-i)) 在
for(long i = 1; i <= m; i++) {
long j = (fullsum - 2*(sum -i))/2;
if(j >= m+1 && j <=n) {
swaps++;
}
}
对于(长i=1;i=m+1&&j)重写如果(sum-i+j==fullsum-sum-j+i)
,我们得到
if(2*j == fullsum - 2*(sum-i))
在第一个代码中,分配给j
的值为
long j = (fullsum - 2*(sum -i))/2;
问题很清楚:除法截断导致了不正确的结果。在某些情况下,假设fullsum-2*(sum-i)=45
,并且j=22
。现在,第二个条件将为false,因为2*j!=fullsum-2*(sum-i)
但是,对于第一个条件,(fullsum-2*(sum-i))/2
的值为45/2=22
(floor division),因此条件j=(fullsum-2*(sum-i))/2
将在不应该的情况下计算为有效结果。对不起,我发布了错误的问题。现在我已经进行了必要的更改。对于由此带来的不便,我深表歉意。
long j = (fullsum - 2*(sum -i))/2;