【问题标题】:Euler's number expansion欧拉数展开
【发布时间】: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


【解决方案1】:

32bit int 将 fact 限制为 11!

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您不能使用浮点数或 bigint,但其他编译器内在整数类型如 long long、unsigned long long 等呢?为了明确起见,您可以使用 &lt;stdint.h&gt; 的 int64_t 和 uint64_t(或 &lt;cstdint&gt; 的 std::int64_t 和 std::uint64_t,虽然这个头文件还不是官方标准,但许多编译器都支持)。

      【讨论】:

        猜你喜欢
        • 2012-06-21
        • 2018-10-21
        • 1970-01-01
        • 2018-08-22
        • 1970-01-01
        • 2013-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多