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: error: call of overloaded `pow(int&, int&)' is ambiguous”。如果我只是使用 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

因此,您试图在 500 3嵌套循环中获取第 i 个功率。可能不是你想要的。用 pow(i,2) 替换您想要的行为。

请注意,@Mooing Duck 在 C++ 中提出了一个关于 x^y 的很好的观点,即 XOR 运算符。但我认为如果你已经在使用的话,你就会明白这一点pow

于 2012-09-19T18:28:38.373 回答
0

你确定你能处理这么大的战俘吗?

Pow(x,y) 是 x y。看着那(这

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

double pow(双底,双指数);

long double pow ( long double base, long double exponent );

浮动战俘(浮动基数,浮动指数);

double pow(双底,int 指数);

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

没有 INT 版本。您的编译器不知道哪个是正确的。您必须使用 static_cast 来告诉他们,例如:

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

对于大精度计算,您可以使用:

http://gmplib.org/

boost也有一种解决方案。

于 2012-09-19T18:35:09.983 回答
0

它无法确定要使用哪个重载函数。尝试

pow(double(i), i);

或者

pow(double(i), 2);

因为这看起来像你想要的。

于 2012-09-19T18:36:43.117 回答