Вычислить теорему Эйлера о пятиугольных числах с помощью динамического программирования - PullRequest
1 голос
/ 11 марта 2011

Вот ссылка на код, и я также разместил его ниже.

 #include<math.h>
void pentagon(int n)
 {
    int k,p[10],a[10],b[10];
    if(n<0)
      p[n]=0;
    if(n==0)
      p[n]=1;
    for(k=1;k<n;k++)
     {
        a[k]=((3*pow(k,2))-k)/2;
        b[k]=((3*pow(k,2))+k)/2;
     }
    for(k=1;k<n;k++)
     {
       p[n]=pow(-1,k-1)(pentagon(n-a[k])+pentagon(n-b[k]));
     }
   cout<<p[n];
 }
 int main()
 {
   pentagon(4);
   return(0);
 }

Я получаю следующую ошибку:
In function 'void pentagon (int) ': Строка 11: ошибка: вызов перегруженного' pow (int &, int) '- неоднозначная компиляция прекращена из-за -Wfatal-errors

Ответы [ 4 ]

2 голосов
/ 11 марта 2011

Заменить 2 на 2.0 в качестве второго аргумента pow (строки 11, 12).

Смотри также: http://www.cplusplus.com/reference/clibrary/cmath/pow/

1 голос
/ 11 марта 2011

Сбор и исправление всех ошибок (и предупреждений) приводит к следующему коду ( codepad ).Я сделал несколько комментариев о том, что изменилось.

#include <math.h>
#include <iostream> // Some compilers will complain if missing

using namespace std; // Some compilers will complain if missing

// returns int instead of being void
int pentagon(int n)
 {
    int k,p[10],a[10],b[10];
    // recursion end - we want to jump out here right away
    if(n<0) return 0;
    if(n==0) return 1;
    for(k=1;k<n;k++)
     {
        a[k]=((3*(int)pow(k,2.0))-k)/2; // pow needs double as second argument
        b[k]=((3*(int)pow(k,2.0))+k)/2; //   and returns double
     }
    for(k=1;k<n;k++)
     {
       // pow casting and double as second argument, multiplication with pentagon
       p[n]=(int)pow(-1,k-1.0)*(pentagon(n-a[k])+pentagon(n-b[k]));
     }
   cout<<p[n]<<endl; // cleaner output
   return p[n]; // return the calculated value
 }
 int main()
 {
   pentagon(4);
   return(0);
 }

, но я предполагаю, что основной алгоритм все еще неверен, так как вывод:

-1084535312
-1084535311
1074838088
0
3
4
0
0 голосов
/ 11 марта 2011

Вы пропускаете сумму часть уравнения.См. http://en.wikipedia.org/wiki/Pentagonal_number_theorem.

Ваша функция pentagon рассчитывает только один член за раз.Нет кода, который суммирует все термины.

0 голосов
/ 11 марта 2011

Вот некоторые ошибки или улучшения, которые я заметил:

Добавлен iostream и используется пространство имен std:

#include <cmath>
#include <iostream>
using namespace std;

Изменено pow(k,2) на k * k:

a[k]=((3*(k*k))-k)/2;
b[k]=((3*(k * k))+k)/2; 

Добавить символ умножения в p[n] назначение:

p[n] = pow(-1.0,k-1) * (pentagon(n-a[k]) + pentagon(n-b[k]));

Метод pentagon должен возвращать значение, чтобы использовать его в приведенном выше выражении.

...