中易网

根据e=1/1!+1/2!+,,,,+1/n!用C++设计一个编程来计算e精确到1000位

答案:2  悬赏:20  
解决时间 2021-12-12 15:59
求助啊,小弟不会,所以向各位大哥求助啦
能不能给个简单的编程.....楼下那个也许是对的,可在我的C++运行环境GUIDE里运行不出来,显示多处错误。。。。。
最佳答案
这个问题首先是数据存储形式和运算问题。现有的 数据类型没有一种能满足要求,必须定义自己的类型。
可以定义定点的或浮点十进制,定长或不定长存储,
定长存储计算比较简便,不定长计算较为复杂,

算式求和与阶乘的算法并不复杂,可以用递归实现

定义数据类
class VeryLongNumber {
//数据成员
//方法和操作符 set + - * / += -= *= /= ++ --
//包括与标准数据类型的运算符
}

void fun(class VeryLongNumber * t,int n)
{
if(n==1){
t->set(1);
return;
}
fun(t,n-1);
class VeryLongNumber tmp(1);
tmp/=n;
(*t) *= tmp;
}
void sum (class VeryLongNumber * sumo,int n){
if(n==1){
sumo->set(1);
return;
}
sum(sumo,n-1);
class VeryLongNumber * tmp=new VeryLongNumber(0);
fun(tmp,n);
(*sumo)+=(*tmp);
delete tmp;
}

要完善自定义的极长精度的数据类型绝非一时半刻能办的到的还要不断摸索,测试,反复修改。有了方法和思路,离实现就进了一步。这是现编的程序也没有测试难免有错误,思路没有问题。以后有时间再考虑自定义极长精度数据类型问题

搂主,数据类必须把内部的成员函数全部声明后,下边的程序才能编译通过,现在运行是不可以的,必须完善数据类以后才能运行
如果先用double 型代替 可以测试下面的函数是否算法正确。

方法 用double 代换 class VeryLongNumber
set 函数 和对象置初值 直接用赋值
然后就可以运行了,不过精度不够,n不能过大

极长精度数据类 可以用类似double 方法

class VeryLongNumber {
int power;
int data[1500];
VeryLongNumber (){ power=0;for(int i=0;i<1500;i++)data[i]=0;};
VeryLongNumber (int n){
for(int i=0;i<1500;i++)data[i]=0;
if(n==0){
power=0;
return;
}
int m=0;
data[0]=n/abs(n); //符号
m=(int)log10(abs(n))// 幂
power=m;
for(int j=0;j<=m;j++){
data[j+1]=int (n/(10**m));
}
}
void adjust();
class VeryLongNumber operate +(class VeryLongNumber &a);
//
//
}
全部回答
#ifndef uint typedef unsigned int uint; #endif #include #include #define n 100000 int getlength(int m) { int n=1; double x=2.0/2.72; while(m) { while(x<1.0) { x*=(double)(++n+1); } while(x>=1.0 && m) { x/=10.0; --m; } } while(x<1.0) { x*=(double)(++n+1); } return n; } int main(int argc, char* argv[]) { const uint base=1000000; int i,k,m,n = n; m=getlength(n); uint *r=new uint[m+1]; assert(r!=null); for(i=0;i<=m;++i) r[i]=1; printf("e=2.\n"); for(k=n;k>0;k-=6) { uint y=0; for(i=m;i>=2;--i) { y=y+r[i]*base; r[i]=y%i; y/=i; } if(k<6) { char str[128]; sprintf(str,"%06d",y%base); str[k]='\0'; printf("%s\n",str); } else { if(y
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯