#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中的X =1+ X +(1/2!)* X等等总是1得到e=1+1+1/2!+1/3!+1/n!计算
程序应按N
的顺序计算所以如果N是1,它将只计算相应的阶乘除法部分;这意味着变量的一部分将保存计算结果,即x=1.00000000~,而另一部分将保存到目前为止的实际总和,即e=2.000000~
N = 2x = 1/2 !, e=前一个e+x
N = 3x = 1/3 !, e=前一个e+x
N的最大个数为29每次计算结果时,需要将点后的所有数字保存到单独的变量中,如x[1] x[2] x[3]
,直到将精度的30~35位数字都填满为止。所以在打印出来的时候,在N=2
x[0]。x [1] x x [3] ~ [2]应该是0.50000000000000000000其中x[0]将保存点上方的值,x[1~3]
将保存其余的值,每个值为5位。
好吧,是的,抱歉如果我的解释糟糕,但这就是它的要求。所有数组必须是整型的,不能使用其他类型我不能使用bigint,因为它违背了目的
我遇到的另一个问题是,在做操作时,直到7号都很顺利。从8号开始,以此类推,如果不给我负数,它就不会继续下去。
for N=8
应该是00002480158730158730158730。相反,我得到00002 48015 -19220 -41904 30331 53015 -19220
这显然是由于int的限制,因为在那部分它确实存在40320 % 1936000000得到a[3]
的值,也就是35200,再乘以100000给我们一个3520000000/40320,虽然a[3]的值超过了整数的极限,有什么办法解决这个问题吗?我不能使用双精度或大整型,所以如果有人有解决这个问题的方法,我将不胜感激。
不能使用浮点型或bigint型,但是其他编译器固有的整型,如long long, unsigned long long等呢?为了使它显式,你可以使用<stdint.h>
的int64_t和uint64_t(或<cstdint>
的std::int64_t和std::uint64_t,尽管这个头还不是官方标准,但在许多编译器上都支持)。
我不知道这是否有任何用处,但您可以在这里找到我写的计算欧拉数的代码:http://41j.com/blog/2011/10/program-for-calculating-e/
32bit int限制为11!
- 所以你必须存储所有上述事实除以一些数字
- 12 !/10000
- 13 !/10000
- 当不适合时使用10000^2等等
- 使用时,除法结果只是移到后面的四位小数…
- 你当然不能除以1/n!
- 上的整数将为零而不是除10000
- 但是这限制了n!到9999,所以如果你想要更多,到处加零,结果是小数
- 我也认为可能会有溢出,所以你也应该继续使用上面的数字