【问题标题】:Is there a way to know if an integer division operation had a remainder?有没有办法知道整数除法运算是否有余数?
【发布时间】:2021-06-12 12:05:11
【问题描述】:

我不想知道余数是什么,我只想知道是否存在作为布尔值的余数。 因此,使用模运算符不是我想要的。 C 中的东西会更好,但任何语言都可以。

【问题讨论】:

  • (a % b) != 0 是要走的路,尽管a % b 也可以
  • '使用模运算符不是我想要的'....我不同意。你的要求就像'我需要打钉子,但我不想用锤子':(
  • 嗨,欢迎来到 Stack Overflow。具有非零结果的模运算符将是您正在寻找的布尔值,就像@qrdl 建议的那样。
  • “因此,使用模运算符不是我想要的。”为什么不?太简单了,太易读了?

标签: c boolean division modulo integer-division


【解决方案1】:

如果你真的不能使用余数运算(作业约束?),那么你可以使用

check_remainder = b*(a/b) != a; 

但其余使用% 是自然的方式。

【讨论】:

  • 这是对模数工作方式的一种定义......请参阅godbolt.org/z/rWas1r。相同的机器代码。
  • @Lundin 我知道。我将此练习解释为一项家庭作业或一个简单的挑战:如何避免使用余数 % 运算符 ...
  • 是的,谷歌“没有模的 c 余数”在这里给出了大约 5 种不同风格的答案(或 icky 的迭代方法)......
【解决方案2】:

使用div(),它有望通过 1 次操作计算商和余数。

#include <stdlib.h>
//...
int a = 42, b = 5;
div_t c = div(a, b);
if (c.rem) /* remainder for a/b is not zero */;
//...

【讨论】:

  • 这比取模快吗?我想我的问题真的是:取模是检查可除性的最快方法,还是有更快的方法来检查一个数字是否可以除以另一个数字,而不知道余数?
  • 根据我的时间,在我的低端 Debian 电脑上:no。在我的计算机上使用首选编译设置,使用%Damien's expression 与使用div 大致相同且速度快2
【解决方案3】:

在计算余数之前,您无法判断是否存在余数,这意味着您必须执行除法。

也就是说,您可以采取一些捷径,但前提是除数是 2 的幂。例如,如果最低有效位为 1,则除以 2 将有余数。通常,除以 2如果最低 n 位的值不是 0000.....0(n 个零),则 n 次方将有余数。

在汇编级别,某些体系结构(例如 x86)为您提供 DIV 指令的结果的商和余数。

如果不能使用取模运算符(或内部使用的除法运算符),你可以用幼稚的方式来做:

unsigned has_remainder (unsigned a, unsigned b)
{
  while (a >= b)
    a -= b;
  return a;
}

【讨论】:

    猜你喜欢
    • 2019-11-17
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    相关资源
    最近更新 更多