我的代码中有什么错误?

时间:2013-12-26 12:17:23

标签: c++

我正在解决Project Euler problem 29。如果地图中不存在,我有一个强力方法只是将所有找到的数字映射为真。我得到的答案是9216,这是不正确的。哪里出错了? 我也尝试过使用套装,但它们都是一样的。

int main()
{
map <long double,bool> m;
long double x;

int c=0;
for(int i=2;i<=100;i++)
{
    for(int j=2;j<=100;j++)
    {
        x=pow((long double)i,(long double)j);
        if(m.find(x) == m.end())
        {
            m.insert ( pair<long double,bool>(x,true) );
            c++;
            cout<<x<<endl;
        }
    }
}
cout<<c<<endl;

}

编辑:
我改变了这一行

m[x]=true;

m.insert ( pair<long double,bool>(x,true) );

答案仍然相同。

3 个答案:

答案 0 :(得分:5)

由于您使用的是双打,我的猜测是您获得的重复数字在双重表示中并不完全相同(因此它们会占据地图中的不同条目)。尝试创建索引整数的映射。

答案 1 :(得分:1)

我不确定。但看起来你还没有在地图“m”中添加条目。 因此,它正在考虑垃圾值。

答案 2 :(得分:0)

exp会在double而非long double中生成结果,因为这些结果不再使用。编译器会将任何long double转换为double。 双精度具有有限的精度,exp将返回两个操作略有不同的结果,导致地图保存额外的值。

以下是您的代码的简化版本:

#include <set>

int main()
{
    set <double> m;

    for (int i = 2; i <= 100; ++i)
    {
        for (int j = 2; j <= 100; ++j)
        {
            m.insert(pow((double)i, (double)j));
        }
    }

    cout << m.size() << endl;
}