【问题标题】:Checking if a number is odd with n%2 or n&1使用 n%2 或 n&1 检查数字是否为奇数
【发布时间】:2017-01-26 22:44:08
【问题描述】:

我正在解决https://www.codechef.com/COOK74/problems/TALAZY

第一次提交(错误答案):https://www.codechef.com/viewsolution/11557512

第二次提交(接受):https://www.codechef.com/viewsolution/11560985

变化正在改变

如果(n % 2){ ...

如果(n & 1){ ...

有区别吗?

编辑:在人们指出“long”到“long long”的变化后,我编辑了问题。

【问题讨论】:

  • 请不要在此处询问有关在线代码判断引擎的问题。任何人都不太可能从他们的测试用例中告诉你你失败的地方,因为这些通常不会被披露。即使您测试的是在本地环境中运行,您也可能错过了测试在线挑战中应用的一些边缘案例。要有创意并尝试找到它们。此外,从长远来看,这些问题可能没有任何价值,除了在在线比赛中作弊,什么都学不到。
  • 两种情况下的代码都是一样的。所以我认为没有任何遗漏任何测试用例的问题。我的重点是为什么操作员的变化有效?这两个语句的工作方式相同。
  • 可以去掉测试写x = (n+1) >> 1;
  • 不错的一个。谢谢!
  • 这两个代码之间有几个变化。

标签: c++ if-statement operators bitwise-operators


【解决方案1】:

在您提交的错误答案中,n、m 和 b 被声明为“long”,而在另一个提交中,它被声明为“long long”,而为它们提供的限制为 10^8。 long 的范围取决于平台以获取更多参考,您可以检查“What's the difference between long long and long”。尝试将其更改为 long long。

【讨论】:

  • 非常感谢。我会保重的。了解了检查数字是否为奇数以及处理溢出。
【解决方案2】:

尽管在线评委这么说,模数方法比国家英里更好。尽管在 C++11 之前,任何余数的符号都是实现定义,但这在测试根本没有余数时无关紧要。此外,从 C++11 开始,余数的符号(如果有)必须与输入 n 的符号匹配。

flashier n & 1实现定义 用于否定 n:这取决于您的平台是使用 1 的补码、2 的补码还是有符号整数类型的有符号幅度。

【讨论】:

  • 您的意思是说两者在所有情况下都不安全,而“if(n % 2==1)”是安全的方式。是吗?请让我知道什么是最好的方法。
  • 没有。它们都受到实现定义的影响。我已经粘贴了一个安全的方法。
  • 这太长了,不能只检查一个数字是奇数还是偶数。无论如何,谢谢!
  • 这是错误的。从 C++11 开始,模数现在保证满足左侧的符号。请参阅 C++ 标准 ([expr.mul]) 的第 5.6.4 节。
  • 这是 - 我非常愚蠢。又是一次编辑,是时候将这个答案 wiki 了。
【解决方案3】:

您的解决方案中的问题不是您试图找出一个数字是奇数还是偶数。

溢出问题。

在我们的第二个解决方案中,您将计数器 n、b、m 和 x 的值类型从 long 更改为 long long。这会有所不同。事实上,您也可以使用您在第一次尝试中使用的方法轻松验证在您的第二个解决方案中更改奇数/偶数代码。

它会返回相同的结果

【讨论】:

  • 非常感谢。我会保重的。了解了检查数字是否为奇数以及处理溢出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 2011-01-29
  • 2019-05-25
  • 2022-11-13
相关资源
最近更新 更多