通过动态规划计算欧拉五边形数定理

发布于 2024-10-21 08:23:49 字数 625 浏览 7 评论 0原文

这是代码的链接,我也将其发布在下面。

 #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);
 }

我收到以下错误:
在函数“void pentagon(int)”中: 第 11 行:错误:重载 'pow(int&, int)' 的调用不明确 编译因 -Wfatal-errors 终止

Here is a link to the code and I have posted it below too.

 #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);
 }

I am getting the following error :
In function 'void pentagon(int)':
Line 11: error: call of overloaded 'pow(int&, int)' is ambiguous
compilation terminated due to -Wfatal-errors

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

半仙 2024-10-28 08:23:49

2 替换为 2.0 作为 pow 的第二个参数(第 11、12 行)。

另请参阅:http://www.cplusplus.com/reference/clibrary/cmath/pow /

Replace 2 with 2.0 as the second argument to pow (line 11, 12).

See also: http://www.cplusplus.com/reference/clibrary/cmath/pow/

嘿咻 2024-10-28 08:23:49

收集并更正所有错误(和警告)会生成以下代码 (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

Collecting and correcting all the errors (and warnings) leads to the following code (codepad). I made some comments about what changed.

#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);
 }

but I guess the underlying algorithm is still wrong, as the output is:

-1084535312
-1084535311
1074838088
0
3
4
0
煞人兵器 2024-10-28 08:23:49

以下是我发现的一些错误或改进:

添加了 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 方法需要返回一个值才能在上面的语句中使用它。

Here are some errors or improvements I spotted:

Added iostream & using namespace std:

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

Changed pow(k,2) to k*k:

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

Add multiplication symbol to p[n] assignment:

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

The pentagon method needs to return a value in order to use it in the above statement.

×纯※雪 2024-10-28 08:23:49

您缺少等式的求和部分。
请参阅http://en.wikipedia.org/wiki/Pentagonal_number_theorem

您的 pentagon 函数一次仅计算一项。没有代码可以对所有项求和。

You're missing the summation part of the equation.
See http://en.wikipedia.org/wiki/Pentagonal_number_theorem.

Your pentagon function only calculates one term at a time. There is no code that sums all of the terms.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文