2013-12-26 8 views
2

Я решаю 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; 

}

EDIT:
Я изменил эту линию

m[x]=true; 

в

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

Ответ на этот вопрос до сих пор то же самое.

+0

Вы ничего на карте не вставляя. Ты? – Hariprasad

+0

не m [x] = true небезопасный ярлык, чтобы вставить что-то на карту? –

+1

'm [x] = true' будет вставлять ключ' x', если он еще не существует. – Anthony

ответ

5

Поскольку вы используете удваиваете, я предполагаю, что вы получаете повторяющиеся числа, которые не одинаковы в двойном представлении (поэтому они занимают разные записи на карте). Попробуйте создать карту, которая индексирует целые числа.

+0

Целые функции не помогут; не существует целочисленного типа C++. (Эти проблемы намного проще в таких языках, как Python, которые имеют встроенные бонусы.) – user2357112

+0

Это мое предположение. Пробовал точно какой-то подход в быстром скрипте Python и получил правильный ответ. Однако некоторые из результатов (например, 'pow (100, 100)' слишком велики, чтобы вписаться в 64-битное целое число. – Anthony

+0

Хотя они не могут решить проблему Эйлера, я думаю, что они решают ошибку программирования (вы можете попробовать с меньшими ограничениями, чтобы убедиться). – ChronoTrigger

1

Я не уверен. но похоже, что вы не добавили записи на карте «m». Таким образом, он рассматривает значения мусора при поиске.

+0

Я изменил его, чтобы вставить, но он все тот же. –

0

exp даст результат в double не long 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; 
} 
Смежные вопросы