|
推荐
楼主 |
发表于 2020-2-2 16:36:41
|
只看该作者
这里我有步步为营逐步改进的方法来给大家演示这个题的解法,首先,我们不用高精度,做一个基本的程序框架,
假设用s表示最后的结果,a表示每个单项的结果,仔细观察会发现a=a/i,虽然a=1/1!,但是后者不便于计算。- #include<iostream>
- using namespace std;
- double s,a;
- int i,n;
- int main()
- {
- n=10;
- s=a=1;
- for (i=1; i<=n; i++)
- {
- a=a/i;
- s=s+a;
- }
- cout<<s;
- return 0;
- }
复制代码
运行此程序,答案是2.718,验证思路是正确的。那么现在就是要在这题里面改进高精度的加法和除法。
显然复习前面的单精度除法,
- #include<iostream>
- using namespace std;
- const int mm=10010;
- int a[mm],s[mm],i,p,x,n;
- int main()
- {
- cin>>n;
- for (p=0; p<=mm-1; p++) a[p]=s[p]=0;
- s[0]=a[0]=1;
- for (i=1; i<=10000; i++) ///先计算到100试试看
- {
- ///a=a/i;
- x=0;
- for (p=0; p<=mm-1; p++)
- {
- x=10*x+a[p];
- a[p]=x/i;
- x=x%i;
- }
- int sa=0;
- for (p=0;p<=n+10;p++) sa+=a[p];
- if (sa==0) break;
- ///s=s+a;
- for (p=0; p<=mm-1; p++) s[p]+=a[p];
- ///jinwei
- for (p=mm-1; p>0; p--) ///右往左
- {
- int x=s[p];
- s[p]=x%10;
- s[p-1]+=x/10;
- }
- }
- cout<<"2."<<endl;
- for (p=1; p<=n; p++)
- {
- cout<<s[p];
- if (p%10==0) cout<<' ';
- if (p%50==0) cout<<endl;
- }
- }
复制代码
|
|