大数阶乘

来源:互联网 发布:域名属性 编辑:程序博客网 时间:2024/05/16 04:47

本程序主要计算超大数的阶乘运算

#include<stdio.h>
#define maxsize 10000     //定义数组大小
int main()
{
    int fun(int *a,int n,int i);
    int a[maxsize]={0};        //j将数组赋值为0;
    int n,i,j;
    scanf("%d",&n);
    if(n==0)
        printf("1\n");
    else
    {
        i=maxsize-1;             //i取数组的最后一个单元
        a[i]=1;          //并将最后一个单元赋值为1;
        while(n!=1)
        {
            i=fun(a,n,i);        //将返回的值给i;  这时的i指向第一个数组元素不为0的数
            n--;
        }
        j=i;           //j从i开始,i记录的是第一个不为0的数的位置
        for(;j<maxsize;j++)
        {
            if(a[j]==0)
                printf("0000");          //因为四个连续的0在一个数组元素中只会存一个0,所以要特别输出四个0 
            else if(a[j]<10&&j!=i)        //因为每个数组元素都是存一个四位,所以输出时也要是一个四位
                printf("000%d",a[j]);         //但是第一个数组元素可能不是一个四位数
            else if(a[j]<100&&j!=i)
                printf("00%d",a[j]);
            else if(a[j]<1000&&j!=i)
                printf("0%d",a[j]);
            else
                printf("%d",a[j]);
        }
        printf("\n");
    }
    return 0;
}
int fun(int *a,int n,int i)
{
    int j,k,m,p,up;
    for(p=maxsize-1;p>=i;p--)           //p从最后开始一次往前乘以n;
        a[p]=a[p]*n;
    for(j=maxsize-1;j>=0;j--)          //j从最后开始对每一个元素进行处理,直到数组的第一个数
    {
        k=j;                        //k记录j走到的位置
        m=a[j];                     //并用m取这个位置的数值
        if(m!=0)                    //如果m等于0,说明这个位置不用进行往前进位
        {
            up=j;                   //up保留j位置每次不为0的位置,最后up保留的就是从前往后第一个不为0的数的位置,
            while(m>=10000)             //如果不等于0,判断是否大于五位数,
            {
                a[k]=m%10000;        //如果大于五位数。则取后四位数保留下来
                m=m/10000;               //m的值去掉后四位
                a[k-1]=a[k-1]+m;           //并把剩的数往前进位,即将剩余的数往前加
                k--;                  //k的位置往前移
                m=a[k];               //并把该位置的数给m,接着判断是否大于五位数
            }
        }
    }
    return up;                       //把up的位置返回给i;这时up指向第一个不为0的位置
}


0 0