码迷,mamicode.com
首页 > 编程语言 > 详细

【C++】Calculate the exact number of e.

时间:2016-09-27 09:12:47      阅读:234      评论:0      收藏:0      [点我收藏+]

标签:

As we know,the Natural Constant,which usually called e,has two main ways of expressing:

1. \( \lim_{n \to \infty}\sum_{i=0}^{n}(\frac{1}{i!}) \)

2. \( \lim_{n \to \infty}(1+\frac{1}{n})^{n} \)

 Let we have a try,the following two python(Version 3.4) program shows you the cruel fact.:(

技术分享

  Number The level of deviation
Number of Formula One 2.7182818284590455 \( {10}^{-16} \)
Number of Formula Two 2.7181459268249255 \( {10}^{-4} \)
The exact number of e 2.7182818284590452 ------

So obviously,the convergence rate of Formula One is much more fast-speed.Also the calculate time it costs is not far more than Formule One.

So take action.:)

Another fact is,what most of us care most is how many accurate digits we can reach,not how big or small the \( n \) is.

Though the high accuration calculation is required, the program still have two variables : \( s \) and \( t \) ,which is usually used to store the sum and the factorial.When the \( n \) is large enough, the very digit of s can be stable, which means the same digit of t is \( 0 \), to be safer ,we should put another sereval \( 0 \) behind it, which won‘t cost much more time.

The One billion(\( {10}^{9}  \)) binary system should be used in order to minimize the time use.

So here is the program:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#pragma warning(disable:4996)
#define ll long long
using namespace std;
const int maxn=100010;
ll *a,*b;
int n,m,x;
ll p;
void div(int t){  //high-accuration division
    ll s=0;
    for (int i=x;i<=n;i++){
        s=s*p+b[i];
        b[i]=s/t;
        s%=t;
    }
    while (b[x]==0) x++;
}
string op(ll x,bool fx=false){   //Translate 10^9 number into string
    string s="";

    for (int i=1;i<=m;i++){
        string s1="";
        s1=(char)(x%10+48);
        s1+=s;s=s1;
        x=x/10;
    }
    if (fx){
        int i=0;
        while (s.at(i)==0) i++;
        s=s.substr(i);
    }
    return s;
}
int main(){
    cin >> n;n++;
    m=9;int v=n;n=n/m+5;
    int nn=n;n=n+8;  // some more space should be spared
    p=1;for (int i=1;i<=m;i++) p*=10;
    a=new ll[n+1];b=new ll[n+1];
    for (int i=2;i<=n;i++) a[i]=0;a[1]=1;a[n+1]=1;
    for (int i=2;i<=n;i++) b[i]=0;b[1]=1;b[n+1]=1;  // initialize a and b ,which means s and t.
    int t=1;x=1;
    while (x<=nn){
        div(t++);ll k=0;
        for (int i=n;i>=1;i--){
            a[i]+=b[i]+k;
            k=a[i]/p;a[i]%=p;   
        }
        int i=x-1;
        while (k!=0){
            a[i]+=k;k=a[i]/p;
            a[i]%=p;i--;   //high-accuraton plus
        }
    }
    string s1="";
    for (int i=1;i<=nn;i++) s1+= op(a[i],i==1);
    s1=s1.substr(0,v);
    string s2=s1.substr(0,1);
    s2+=".";
    s2+=s1.substr(1);
    printf("%s\n",s2.c_str());
    return 0;
}

//This code can run properly on vs2012
Number of digit required Time use(ms)
100 0
1000 31
5000 109
9500 265
10000 297
20000 873
50000 4446
100000 16365
1000000 About 20min

技术分享

 

【C++】Calculate the exact number of e.

标签:

原文地址:http://www.cnblogs.com/Fefnir/p/5911409.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!