#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和其余的都是故意未完成的,因为它仍处于构建阶段。
现在,我需要扩展euler'号码, 这应该让你使用像x [n]这样的系列来将结果分成多个部分并使用函数来计算结果等。
根据它, 我需要找到Maclaurin扩展的特定部分并进行计算。
因此,e = 1 + x +(1/2!)* x中的X等等始终为1 给我们e = 1 + 1 + 1/2!+1/3!+ 1 / n!计算
程序应按N
的顺序计算所以如果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的限制,因为在那部分确实如此
19.36亿40320%
为了获得a[3]
的值,然后是35200,然后乘以100000
给我们一个3520000000/40320,虽然a [3]的值超过了整数的限制,有什么方法可以解决这个问题吗?
我不能使用双打或Bigints,所以如果有人有解决方法,我们将不胜感激。
答案 0 :(得分:0)
你不能使用浮点数或bigint,但是其他编译器内部整数类型如long long,unsigned long long等等呢?为了使它明确,你可以使用<stdint.h>
的int64_t和uint64_t(或<cstdint>
的std :: int64_t和std :: uint64_t,虽然这个标题尚未正式标准,但许多编译器都支持)。
答案 1 :(得分:0)
我不知道这是否有用,但您可以在此处找到我编写的用于计算欧拉数的代码:http://41j.com/blog/2011/10/program-for-calculating-e/
答案 2 :(得分:0)
32bit int将事实限制为11!