我正在解决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) );
答案仍然相同。
答案 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;
}