精度计算——大数阶乘

时间:2023-01-30 03:35:31

小练习,大数阶乘代码

思想:

  运算结果放在long long类型的数组a中(如果放在字符串中还要进行字符串和数字的转换,容易出错),数组中每个数据都是一个四位数。

  阶乘顺序1*2*3*……*n(用i表示其中的一个数),每次的运算结果都存储在a中,每次运算的时候,把a中的每个数依次与i相乘。

代码:

#include <stdio.h>
#include <math.h>

int factorial(int n)
{
    long long a[10000];//存储运算结果,运算过程中抱保证每个a是个四位数
    a[0] = 1;
    int m = 0, w, c; //w存储运算结果的位数,m记录存储运算结果的数组的下标,c保存运算结果中大于四位的部分,用于进位。
    for(int i = 1; i <= n; i++) //参加阶乘的数字,1*2*3*……*n
    {
        c = 0;
        for(int j = 0; j <= m; j++) //上一步运算结果数组中的每一个数
        {
            a[j] = a[j] * i + c;
            c = a[j] / 10000;
            a[j] = a[j] % 10000;
        }
        if(c > 0) {m++; a[m] = c;}
    }

    w = m*4 + log10(a[m]) + 1; //结果的位数

    for(int i = m; i >= 0; i--)//输出运算结果
        printf("%d", a[i]);
    return w;
}
int main()
{
    factorial(10);
    return 0;
}