Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我的代码中有什么错误?_C++ - Fatal编程技术网

C++ 我的代码中有什么错误?

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

我正在解决。我有一个蛮力的方法,只要把地图上不存在的所有数字都映射为真。我得到的答案是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.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;
}