【问题标题】:Finding number of Odd/Even/Negative numbers in a BST in C [closed]在C中的BST中查找奇数/偶数/负数的数量[关闭]
【发布时间】:2018-06-11 23:35:36
【问题描述】:

我正在编写一个函数来查找 BST 中奇数/偶数/负数的数量。你传入一个树和一个指向函数的指针。

int countIf (treelink tree, int (*pred)(TreeItem)) {
    if ( tree == NULL ) return 0;
    return (*pred)(tree->item) + countIf(tree->left,pred) + countIf(tree->right,pred);
}

函数指针 pred 可以是这样的:

int isEven (TreeItem n) {
return !(n%2);
}

int isOdd (TreeItem n) {
    return n%2;
}

int isNegative (TreeItem n) {
    return (n < 0);
}

为什么 countIF 的代码不起作用?它只适用于某些情况,而不是全部。 谢谢

它正在使用这组数字:7 5 11 3 6 9 15 1 4 8 10 14 16 但不是这样:7 -5 11 -9 3 10 15 1 4 8 14 16 6

【问题讨论】:

  • 如果n 为负数,n % 2 的返回值是多少?!另外:pred(tree-&gt;item)function call operator is defined only on pointers-to-function。函数衰减为指向函数的指针。
  • 也对没有产生正确的minimal reproducible example 表示反对,包括:提出一个失败的案例。
  • 谢谢,我的问题在于 isOdd 和 isEven 函数,而不是 countIf 函数。我在这里有点新,所以下次将包括示例
  • @AnttiHaapala 好点,isOdd 将返回 -1 用于负奇数。使用!!(n%2) 可以解决它,甚至只是n&amp;1
  • @Billi 它仍然不是最小的。你应该做的是找出最小的测试用例。并产生一个最小的可运行程序。最后你会发现 isOdd 有时会返回 -1 并且会问这个问题。

标签: c recursion binary-search-tree


【解决方案1】:

如果n 为负,则n % 2 的结果为-1。然后,当您在负数上使用isOdd 时,每个负奇数将从总数中减去一个。

至少有 3 种可能的修复方法:

  • 使用&amp; 1(假定为 2 的补码)
  • 使用 !! 将其反转为布尔值,然后再次反转(将其强制为 0 或 1)
  • 计算绝对值的模​​数:abs(n) % 2。这适用于超过 2 的模数。如果系统使用 2 的补码并且值等于 INT_MIN,则不起作用(感谢 @user694733)。
  • 计算余数的absabs(n % 2),即使在INT_MIN 的情况下也应该有效。

(-1) % 2产生-1的原因在于C11 6.5.5p6

  1. 当整数被除法时,/ 运算符的结果是任何小数部分被丢弃的代数商。如果商a/b 是可表示的,则表达式(a/b)*b + a%b 应等于a;否则,a/ba%b 的行为是未定义的。

现在,给定a = -1b = 2,截断意味着(-1) / 2 产生-0.5,并且小数截断效果与舍入趋向零相同em>,因此结果是0。现在,因为((-1) / 2) * 2 + (-1) % 2 必须等于-1(-1) / 2 是 0,因此 ((-1) / 2) * 2 是 0,那么 0 + (-1) % 2(-1) % 2,根据规则,这必须评估为 -1

【讨论】:

  • 我不太喜欢 abs 方法:它不适用于 INT_MIN 在 2 的补码上。
  • @user694733 好吧,不用担心:D
猜你喜欢
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-03
  • 2016-04-04
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
相关资源
最近更新 更多