【问题标题】:C++ test for divisibility with doubleC++ 用 double 测试可分性
【发布时间】:2012-10-29 14:38:09
【问题描述】:

当 num 是双精度时,为什么 ((num / i) % 1 == 0) 不能在 C++ 中工作?以及我将如何编写此代码,通过检查它是否留下余数来检查阶乘(等 0.3333)。

int getFactorials (double num)
{
    int total = 0;      // if (total / 2) is equal too 'num' it is a perfect number.

    for (int i = 1; i < num; i++)
    {
        if ((num / i) % 1 == 0)
        {
            cout << i << endl;
        }
    }
    return 0;
}

【问题讨论】:

  • 在进行取模之前添加一个转换为整数类型。
  • 你的意思是factorial还是factor
  • 我猜的因素。我把它们混在一起
  • @didierc:如果我将双精度数(num)转换为整数,那么算法将不起作用
  • 这看起来是错误的。 "doing % 1" 在除以 1 时返回余数。永远为零。

标签: c++ double factorial arithmetic-expressions


【解决方案1】:

实际上你要做的是检查n 是否可以被i 整除,所以你要做的就是改变

if ((num / i) % 1 == 0)

进入

if (num % i == 0) 

您应该知道这很容易出错,因为您使用double 作为num 的类型。您应该改用int

【讨论】:

  • 不应该(num / i) % 1 == 0 工作吗? (如果不存在舍入错误)
  • if (num % i == 0) 不起作用。例如,如果我将 28 除以 4,则答案是 7 不是零,但 4 是 28 的除数
  • @TomLilletveit % 运算符为您提供n 除以i余数,因此如果i 除以n,它将给出你是零。
  • 请注意,除非double 确实应该接近整数值,否则转换为int 不起作用。并且由于一旦指数部分很大,浮点数就不能准确地表示整数,因此不应该这样使用它们。对大整数使用long long
【解决方案2】:

% 运算符仅允许用于整数类型(以及用户定义的 重载它的类型)。对于浮点,您需要该功能 fmod

【讨论】:

    【解决方案3】:

    此代码返回一个双对象

    (num / i)
    

    模运算仅适用于 int 类型。您可以将其转换为 int 类型

    ( ((int) (num / i) ) % i)
    

    【讨论】:

      【解决方案4】:

      % 运算符由 C++11 §5.6/4 定义:

      如果商 a/b 在结果的类型中是可表示的,则 (a/b)*b + a%b 等于 a。

      这对浮点类型毫无意义。模数的定义取决于除法四舍五入到整数。

      正如 James Kanze 所说,请改用 std::fmod

      【讨论】:

        猜你喜欢
        • 2012-07-09
        • 2012-04-24
        • 2013-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多