4

((num / i) % 1 == 0)num が double の場合、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;
}
4

4 に答える 4

7

演算子は、%整数型 (およびそれをオーバーロードするユーザー定義型) でのみ許可されます。浮動小数点の場合、関数が必要です fmod

于 2012-11-09T09:34:14.317 に答える
6

実際にやりたいことは、nが割り切れるかどうかを確認するiことです。変更する必要があるのは

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

の中へ

if (num % i == 0) 

doubleの型として使用しているため、これはエラーが発生しやすいことを知っておく必要がありますnum。代わりにを使用する必要がありintます。

于 2012-11-09T09:32:42.897 に答える
2

%演算子は C++11 §5.6/4 で定義されています。

商 a/b が結果の型で表現できる場合、(a/b)*b + a%b は a に等しくなります。

これは、浮動小数点型には意味がありません。モジュラスの定義は、整数への除算の丸めに依存します。

James Kanzeが言うように、std::fmod代わりに使用してください。

于 2012-11-09T09:37:04.683 に答える
0

このコードは double オブジェクトを返します

(num / i)

モジュロ演算は int 型のみ可能です。これをint型に変換できます

( ((int) (num / i) ) % i)
于 2012-11-09T09:36:58.167 に答える