【发布时间】:2011-10-07 02:44:32
【问题描述】:
#include <iostream>
#include <iomanip>
using namespace std;
int a[8], e[8];
void term (int n)
{
a[0]=1;
for (int i=0; i<8; i++)
{
if (i<7)
{
a[i+1]+=(a[i]%n)*100000;
}
/* else
{
a[i+1]+=((a[i]/640)%(n/640))*100000;
}
*/
a[i]=a[i]/(n);
}
}
void sum ()
{
}
int factorial(int x, int result = 1)
{
if (x == 1)
return result;
else return factorial(x - 1, x * result);
}
int main()
{
int n=1;
for (int i=1; i<=30; i++)
{
term(n);
cout << a[0] << " "<< a[1] << " " << a[2] << " "
<< a[3] << " " << a[4] << " " << a[5]<< " "
<< " " << a[6] << " " << a[7] << endl;
n++;
for (int j=1; j<8; j++)
a[j]=0;
}
return 0;
}
我上面的代码是我到目前为止的代码。 Sum 和其余部分故意未完成,因为它仍处于构建阶段。
现在,我需要扩展欧拉数, 这应该让您使用像 x[n] 这样的系列来将结果分成多个部分并使用函数来计算结果等。
据此, 我需要找到麦克劳林展开式的具体部分并计算出来。
所以 e=1+x+(1/2!)*x 等中的 X 总是 1 给我们 e=1+1+1/2!+1/3!+1/n!计算
程序应该按照N的顺序计算它
so 如果 N 为 1 则只计算对应的阶乘除法部分; 这意味着变量的一部分将保存计算结果,即 x=1.00000000~,而另一部分将保存到目前为止的实际总和,即 e=2.000000~
对于 N=2 x=1/2!, e=前一个 e+x
对于 N=3 x=1/3!, e=前一个 e+x
N的最大数量是29
每次计算结果时,它需要将点后面的所有数字保存到单独的变量中,如x[1] x[2] x[3],直到所有 30~35 位精度的数字都被它们填充。
所以打印出来的时候,在N=2的情况下
x[0].x[1]x[2]x[3]~
应该出来
0.50000000000000000000
其中 x[0] 应该保存点上方的值,x[1~3] 将保存其余的每个 5 位数。
好吧,对不起,如果我的解释很糟糕,但这就是它的要求。 所有数组都必须在 Int 中,我不能使用其他数组 而且我不能使用 bigint,因为它违背了目的
我遇到的另一个问题是,在进行操作时,它一直运行到 7 日。 从 8 号开始等等,如果不给我负数,它就不会继续。
for N=8
它应该是 00002480158730158730158730。
相反,我得到 00002 48015 -19220 -41904 30331 53015 -19220
这显然是由于 int 的限制,因为在那部分它确实
1936000000%40320
为了得到a[3]的值,然后是35200,然后乘以100000
给我们一个 3520000000/40320,虽然 a[3] 的值超过了整数的限制,有什么办法可以解决这个问题?
我不能为此使用双打或 Bigint,因此如果有人对此有解决方法,将不胜感激。
【问题讨论】:
-
那么从技术上讲,你应该用作业标签标记它。这次是我为你做的。
-
作为初学者,您可能想调用函数
factorial。你定义它但从不使用它。 -
是的,我帖子的后半部分说它超出了限制是我开始调用阶乘的时候。
-
您可以将数字声明为
unsigned int,这将强制将该数字解释为具有更大范围的正数... -
顺便说一句,写
factorial的更好方法是if (n == 0) return 1; return n * factorial(n-1);。 (更不用说你的不包括n == 0。)
标签: c++ arrays math eulers-number