2

次のコードをご覧ください

#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

int main()
{
    //int side1 = 0;
    //int side2 = 0;
    //int rightSide = 0;

    cout << "Right Side" << setw(10) << "Side1" << setw(10) << "Side2" << endl;

    for(int i=1;i<=500;i++)
    {
        //side1++;
        //cout << side1 << endl;

        for(int a=1;a<=500;a++)
        {
            //side2++;
            //cout << "side 2 " << side2 << endl;

            for(int c=1;c<=500;c++)
            {
                //rightSide++;
                int rightSideSqr = pow(c,c);
                int side1Sqr = pow(i,i);
                int side2Sqr = pow(a,a);

                if(rightSideSqr == (side1Sqr+side2Sqr))
                {
                    cout << rightSideSqr << setw(15) << i << setw(10) << a << endl;
                 }


            }
        }
    }
}

これにより、「PythagorialTriples.cpp:28:エラー:オーバーロードされた `pow(int&、int&)'の呼び出しがあいまいです」というエラーが発生します。メソッドの代わりにi*iのような手動電源を使用した場合、これは発生しません。なぜこれが起こっているのか誰かが私に説明できますか?とにかく私はC++に不慣れです。ありがとう

4

4 に答える 4

9

powで定義されたには複数のオーバーロードがあります<cmath>。あなたのコードでは、これら3つはすべて等しく有効であるため、コンパイラーは正しいものを選択するのに問題があります。

        pow(float, int);
        pow(double, int);
        pow(long double, int);

最も簡単な解決策はstatic_cast、最初の引数で使用して、あいまいさを取り除くことです。例えば

int side1Sqr = pow( static_cast<double>(i) ,i );
int side2Sqr = pow( static_cast<double>(a) ,a );
于 2012-09-19T18:31:09.227 に答える
4

うわあ!Pow(x、y)はxをy乗します(数学的には-x y)!! x*yではありません

つまり、 5003のネストされたループでi番目のパワーを取得しようとしています。おそらくあなたが望むものではありません。目的の動作を行うには、pow(i、2)に置き換えてください。

@Mooing Duckは、XOR演算子であるc++のx^yについて優れた点を示していることに注意してください。powしかし、とにかくすでに使用しているのであれば、あなたはそれを理解していると思います。

于 2012-09-19T18:28:38.373 に答える
0

あなたはそのような大きな力を扱うことができると確信していますか?

Pow(x、y)はxyです。見て

http://www.cplusplus.com/reference/clibrary/cmath/pow/

ダブルパウ(ダブルベース、ダブル指数);

ロングダブルパウ(ロングダブルベース、ロングダブル指数);

float pow(float base、float exponent);

double pow(double base、int exponent);

long double pow(long double base、int exponent);

INTバージョンはありません。コンパイラはどちらが正しいかわかりませんでした。次のようにstatic_castを使用してそれらに伝える必要があります。

int side1Sqr = pow(static_cast<double>i,i);

高精度の計算には、次のものを使用できます。

http://gmplib.org/

ブーストからの1つの解決策もあります。

于 2012-09-19T18:35:09.983 に答える
0

使用するオーバーロードされた関数を特定できません。試す

pow(double(i), i);

また

pow(double(i), 2);

それはあなたが望むもののように見えるので。

于 2012-09-19T18:36:43.117 に答える