3
#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 的顺序计算它

所以如果 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,因此如果有人对此有解决方法,将不胜感激。

4

3 回答 3

0

我不知道这是否有用,但你可以在这里找到我写的计算欧拉数的代码:http: //41j.com/blog/2011/10/program-for-calculating-e/

于 2011-10-03T14:55:47.307 回答
0

32bit int 将 fact 限制为 11!

  • 所以你必须存储所有上述事实除以某个数字
    • 12!/10000
    • 13!/10000
    • 当它不再适合使用 10000^2 等等
  • 当使用除法时,结果只是转移到下一个小数点后四位......(正如我假设的那样)
  • 当然你不除 1/n!
    • 在将为零的整数上除以 10000
    • 但这限制了n!只有 9999 所以如果你想要更多的地方添加零,结果是小数
  • 我也认为可能会有一些溢出,所以你也应该继续使用高位数字
于 2013-10-08T07:16:31.207 回答
0

您不能使用浮点数或 bigint,但其他编译器内在整数类型(如 long long、unsigned long long 等)呢?为了明确起见,您可以使用<stdint.h>'s int64_t 和 uint64_t(或<cstdint>'s std::int64_t 和 std::uint64_t,尽管此标头尚未正式标准,但许多编译器都支持)。

于 2011-07-19T19:02:19.547 回答