我目前正在学习C ++,所以我是初学者。我以为我会制作一个小程序来生成贝塞尔多项式项。这是该计划:
#include <iostream>
// x!
long long fact(const long long &x)
{
long long z {1};
for (long long i=1; i<=x; ++i)
z *= i;
return z;
}
// 2^n
long long pwr2(const int &n)
{
long long z {1};
for (long long i=0; i<n; ++i)
z *= 2;
return (n == 0 ? 1 : z);
}
// Bessel coefficients
long long bessel(long long *a, const long long &N)
{
for (long long i=0; i<=N; ++i)
a[i] = fact(N + i) / (pwr2(i) * fact(N - i) * fact(i));
return *a;
}
int main()
{
std::cout << "N = ";
long long N;
std::cin >> N;
long long *a {new long long[N + 1]};
*a = bessel(a, N);
for (long long i=0; i<=N; ++i)
std::cout << a[i] << ( i<N ? " " : "\n");
delete a;
a = nullptr;
return 0;
}
N = 10似乎是极限。 sizeof(long long)
显示8(archlinux x64)。事实(20)&gt; (2 ^ 64)-1,所以我卡住了,即使是很长的。有没有办法规避这个限制?
正如你所看到的那样,代码是在我绝望并将所有int修改为long long之后。我甚至在所有数字中添加了“ll”,没有任何效果。我甚至从分母中删除了主要括号,并安排了这些术语,使它们逐渐地以某种方式平衡自己,例如:
fact(N+i)/fact(N-i)/fact(i)/pwr2(i)
,也没有效果。
答案 0 :(得分:1)
您不能使用本机类型执行您想要的操作,因为它们受位大小的限制。 但是你可以使用一些库来实现它们(This is one such example) 如果你真的需要它(但根据你的问题,你只是学习c ++所以我猜你不需要那些)