#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;
}
私が上に持っているのは、これまでに持っているコードです。合計と残りは、まだ構築段階にあるため、意図的に未完成のままにしてあります。
ここで、オイラー数の展開を行う必要があります。これは、結果を複数の部分に分割し、関数を使用して結果を計算するために x[n] のような系列を使用することになっています。
それによると、マクローリン展開の特定の部分を見つけて計算する必要があります。
したがって、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.5000000000000000000 として出力される必要があります。ここで、x[0] はドットの上の値をx[1~3]
保持し、残りをそれぞれ 5 桁で保持します。
ええ、私の説明が下手で申し訳ありませんが、これが求めているものです。すべての配列は Int である必要があり、他の配列を使用することはできません。目的に反するため、bigint を使用することはできません。
私が抱えているもう1つの問題は、操作を行っている間、7日までうまくいくことです。8日から始めて 負の数を出さないと続きません。
for N=8
00002480158730158730158730 である必要があります。代わりに、00002 48015 -19220 -41904 30331 53015 -19220 を取得します。
これは明らかに int の制限によるものであり、その部分で の値を取得するために 1936000000%40320 を実行するため、a[3]
35200 を 100000 倍して 3520000000/40320 を計算しますが、a[3] の値は整数の制限、これを修正する方法はありますか? これには double や Bigint を使用できないため、回避策があれば教えていただければ幸いです。