C++ 我的代码中有什么错误?
我正在解决。我有一个蛮力的方法,只要把地图上不存在的所有数字都映射为真。我得到的答案是9216,这是不正确的。哪里出了问题? 我也试过用一套,但都一样C++ 我的代码中有什么错误?,c++,C++,我正在解决。我有一个蛮力的方法,只要把地图上不存在的所有数字都映射为真。我得到的答案是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 dou
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.insert(成对(x,true));
答案还是一样。我不确定。但看起来您没有在地图“m”中添加条目。
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;
因此,它在查找时会考虑垃圾值。因为您使用的是双精度表示,所以我猜您会获得重复的数字,这些数字在双精度表示中并不完全相同(因此它们在映射中占据不同的条目)。尝试创建一个索引整数的映射。
exp
将生成一个双精度非长双精度,因为它们不再使用。编译器将为您将任何长的double转换为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;
}
#包括
int main()
{
设m;
对于(int i=2;i),您没有向映射插入任何内容。是吗?m[x]=true不是向映射插入内容的不安全快捷方式吗?m[x]=true
将插入键x
,如果该键不存在。您是否尝试打印存储的值?可能是您可以尝试使用较小的数字,看看精度是否正确。因为,当您尝试存储较大的值时,精度将丢失。当输入时,您的代码给出了正确的答案。我唯一更改的是comm在循环中显示“代码> x/CODE”的显示。我把它改成了插入,但仍然是一样的。整数不起作用;没有C++整数类型足够大。(在Python语言中,这些问题在内置的Bigon中要容易得多。)这是我的猜测。在一个快速Python脚本中尝试了确切的方法并得到了正确的答案。但是,一些结果(如pow(100100)
太大,无法放入64位整数中。虽然它们无法解决Euler问题,但我认为它们解决了编程错误(您可以尝试使用较小的限制以确保)。那么,你的意思是将a^b转换为整数类型,然后映射它?我尝试了这个方法,但由于我得到的答案是997,所以长整型似乎太小。你也可以使用自己的比较函数创建一个双精度映射,在这里你可以考虑双精度之间的微小差异。
#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;
}