【1998普及】高精度计算

    xiaoxiao2021-03-25  105

    【1998普及】高精度计算

    Description

    用高精度计算出S=1!+2!+3!+...n!)(n<=50)其中"!"表示阶乘,例如:5!=5*4*3*2*1

    Input

    输入正整数N

    Output

    输出计算结果S

    Sample Input

    2

    Sample Output

    3

    题目分析

    常规的高精度计算。 用数组倒序存储每个高精度数据,第一个数x[0]存储每个数的长度。 #include<iostream> #include<cstring> #include<cstring> #include<iomanip> using namespace std; int a[1000]; int b[1000]; void f(int a[],int m) { //先乘 for(int i=1;i<=a[0];i++) a[i]=a[i]*m; //当前位数下处理进位 for(int i=1;i<=a[0];i++) { a[i+1]+=a[i]/10; a[i]%=10; } //处理增加的位数 while(a[a[0]+1]>0) { a[0]++; //位数增加 a[a[0]+1]=a[a[0]]/10; a[a[0]]%=10; } } void j(int a[],int b[]) { //两个高精度相加 if(a[0]<b[0]) a[0]=b[0]; //保证a[0]为两者最大位数 for(int i=1;i<=a[0];i++) { a[i]+=b[i]; a[i+1]+=a[i]/10; a[i]%=10; } //处理增加的位数 if(a[a[0]+1]>0) a[0]++; } void printa(int a[]) { for(int i=a[0];i>=1;i--) cout<<a[i]; } int main(){ int n; a[0]=1; a[1]=1; cin>>n; for(int i=1;i<=n;i++){ f(a,i); j(b,a); } printa(b); return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-17975.html

    最新回复(0)