Расширение числа Эйлера - PullRequest
3 голосов
/ 17 июля 2011
#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], чтобы разделить результат на несколько частей и использовать функции для вычисления результатов и тому подобное.

Согласно этому, Мне нужно найти конкретную часть Расширения Маклаурина и вычислить ее.

Так что X в е = 1 + х + (1/2!) * Х и т. Д. Всегда 1 Дайте нам e = 1 + 1 + 1/2! +1/3! + 1 / n! рассчитать

Программа должна рассчитать его в порядке N

так что если N равно 1, он вычислит только соответствующую часть факторного деления; Это означает, что одна часть переменной будет содержать результат вычисления, который будет x = 1.00000000 ~, а другая часть будет содержать действительную сумму до сих пор, которая равна e = 2.000000 ~

для N = 2 х = 1/2 !, е = предыдущая е + х

для N = 3 х = 1/3 !, е = предыдущая е + х

Максимальное количество N равно 29 каждый раз, когда вычисляется результат, ему нужно хранить все числа после точки в отдельных переменных, таких как x[1] x[2] x[3], пока все 30–35 цифр точности не будут заполнены ими. поэтому при распечатке, в случае N = 2

х [0] .x [1] х [2] х [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, хотя значение [3] превышает предел целого числа, любой способ исправить это? Я не могу использовать двойные или большие буквы для этого, поэтому, если у кого-то есть обходной путь, это будет оценено.

Ответы [ 3 ]

0 голосов
/ 03 октября 2011

Я не знаю, имеет ли это какое-либо значение, но вы можете найти код, который я написал для вычисления числа Эйлера, здесь: http://41j.com/blog/2011/10/program-for-calculating-e/

0 голосов
/ 08 октября 2013

32bit int ограничивает факт до 11!

  • так что вы должны хранить все вышеперечисленные факты, деленные на некоторое число
    • 12! / 10000
    • 13! / 10000
    • когда он больше не подходит, используйте 10000 ^ 2 и т. Д.
  • при использовании результата деления просто сдвигается на следующие четыре знака после запятой ... (как я и предполагал вначале)
  • конечно вы не делите 1 / n!
    • на целых числах, которые будут равны нулю вместо деления 10000
    • но это ограничивает п! только 9999, так что если вы хотите больше, добавьте нули везде, и результат будет десятичным
  • также я думаю, что может быть какое-то переполнение, поэтому вы должны также перейти к старшим цифрам
0 голосов
/ 19 июля 2011

Вы не можете использовать плавающую точку или bigint, но как насчет других встроенных типов компилятора, таких как long long, unsigned long long и т. Д.? Чтобы сделать это явным образом, вы можете использовать <stdint.h> int64_t и uint64_t (или <cstdint> std :: int64_t и std :: uint64_t, хотя этот заголовок пока официально не является стандартным, но поддерживается многими компиляторами).

...