0

コードは次のとおりです。

#include <iostream>
#include <ctype.h>
#include <iomanip>


using namespace std;

class Project3
{
public:
    void factorcalc()
    {
        while (i<5000000){
            ++i;
            factor = prime/i;
            if (factor == (long long int)factor){
            //if (modf(primeoverthree, 0) == 0){
                cout << "Factor is: " << setprecision(12) << factor << endl;
                cout << "Denominator is: " << setprecision(12) << i << endl;

                ++x;
                factorarray[x] = factor;
            }
            else{/*empty else statement*/}
        }
    }
    void displayfactorresults ()
    {
        for (x=0; x<9; ++x)
            if (factorarray[x]%2 == 0 && factorarray[x]%3 == 0 && factorarray[x]%5 == 0 && factorarray[x]%7 == 0){
            cout << factorarray[x] << setprecision(12) << endl;
            }
    }
private:
    long double factor = 1;
    long double prime = 600851475143;
    long double i = 0;
    int x = 0;
    long double factorarray[9];
};


int main() {
    Project3 Pro3;
    Pro3.factorcalc();
    Pro3.displayfactorresults();

    return 0;
}

このコードは、projecteuler.net の Project 3 に対応しています。C ++の基本的な知識と常識を使用して、600851475143の最大の素因数を見つけようとしています。

関数でエラーが発生していvoid displayfactorresultsます。

コンパイラは次のエラー メッセージを出力します。

「バイナリ式 'long-double' & 'long-double' のオペランドが無効です」

4

3 に答える 3

4

%剰余演算子は、整数オペランドにのみ適用できます。

factorarray[x]type long double、浮動小数点型です。

関数を使用するかfmod(丸め誤差に注意してください!)、オペランドを整数型に変換してください。

または、さらに良いfactorarrayのは、最初に十分に大きな整数型の配列を作成することです。値を に変換できるとすでに想定していますlong long int。何かを目的の型に変換することは、通常、最初に目的の型を使用することほど良くありません。

于 2015-05-20T01:45:31.800 に答える
1

factorarraydouble の配列です。%modulo( )は では使用できませんdouble。使用する前に、配列に変換するかint、配列要素をキャストしてください((int)factorarray[x]) % 2 == 0

于 2015-05-20T01:45:14.843 に答える
1

factorarray[x] % 2 == 0(double type % 2 == 0) リマインダーが 0 になることはなく、もちろんコンパイラーはそうすることを許可しないため、意味がありません。

于 2015-05-20T05:51:26.677 に答える