当前位置: 首页 > 编程 > 正文

    最近开始回过头复习过去学习的内容,重新写了一次大数阶乘,附上源码和运行结 […]

    最近开始回过头复习过去学习的内容,重新写了一次大数阶乘,附上源码和运行结果.

 

/**************************************************************************
* 功能   :1000阶乘
* 作者   :韩逸
* 修改时间:20161019
**************************************************************************/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>

#define NUMBER 1000    //阶乘位数
void fnCallCarryBit(int pResult[],int pos);
void fnPrintResult(int pResult[],int nPos,double dblStart,double dblFinish);

int main(int argc,char* argv[])
{

    int i=0;
    int j=0;
    int nPos=0;                //最高位下标
    int nDigit=0;              //阶乘的位数
    int *pResult=NULL;         //阶乘的结果
    double dBlSum=0;
    double dblStart=0.0f;      //程序开始时间
    double dblFinish=0.0f;     //程序结束时间

    FILE *fpTmp=NULL;          //创建文件指针
    fopen_s(&fpTmp,"Factorial.txt","w+");   //打开文件

    if (fpTmp==NULL)
    {
        goto EXIT_PROC;
    }

    dblStart=clock();                    //抓取开始时间
    for (i=1;i<=NUMBER;i++)
    {
        dBlSum+=log10((double)i);        //对数函数.以10为底计算阶乘位数
    }
    nDigit=(int)dBlSum+1;                //阶乘位数

    pResult=(int *)malloc((nDigit+1) * sizeof(int));     //申请空间
    if (pResult==NULL)                               //异常处理
    {
        goto EXIT_PROC;
    }

    for (i=0;i<=nDigit;i++)
    {
        pResult[i]=0;                         //将空间初始化,避免残留值
    }
    pResult[0]=1;                             //将个位初始为1

    for (i=2;i<=NUMBER;i++)                   //逐位与原来结果相乘
    {
        for (j=nDigit;j>=0;j--)               //查找最高位下标
        {
            if (pResult[j]!=0)
            {
                nPos=j;
                break;
            }
        }

        for (j=0;j<=nPos;j++)
        {
            pResult[j]*=i;                   //逐个相乘
        }
        fnCallCarryBit(pResult,nPos);        //处理进位
    }

    for (j=nDigit;j>=0;j--)
    {
        if (pResult[j]!=0)
        {
            nPos=j;
            break;
        }
    }
    dblFinish=clock();                 //抓取程序结束时间
    fnPrintResult(pResult,nPos,dblStart,dblFinish);


    fseek(fpTmp, 0, SEEK_SET);                //将文件指针设到文件头
    fprintf(fpTmp,"%d位阶乘:rn",NUMBER);     
    for (i=nPos;i>=0;i--)
    {
        fprintf(fpTmp,"%d",pResult[i]);
    }
    fprintf(fpTmp,"rn");
    fprintf(fpTmp,"位数:%drn",nPos+1);


EXIT_PROC:

    if (fpTmp!=NULL)
    {
        fclose(fpTmp);
        fpTmp=NULL;
    }

    if (pResult!=NULL)
    {
        free(pResult);
        pResult=NULL;
    }

    system("pause");
    return 0;
}

/**************************************************************************
* 功能   :处理阶乘进位
* 参数   : pResult[]-存放结果,pos-最高位下标
* 返回值 :无
* 作者   :韩逸
* 修改时间:20161019
**************************************************************************/
void fnCallCarryBit(int pResult[],int pos)
{
    int i=0;
    int nCarryBitPrice=0;              //进位值

    for (i=0;i<=pos;i++)               //检查是否要进位
    {
        pResult[i]+=nCarryBitPrice;
        if (pResult[i]<=9)             //不满10不用进位
        {
            nCarryBitPrice=0;          //将进位值复0
        }

        else if (pResult[i]>9&&i<pos)  //需要进位,但未达到最高位
        {
            nCarryBitPrice=pResult[i]/10;  //进位值
            pResult[i]=pResult[i]%10;
        }

        else if(pResult[i]>9&&i>=pos)
        {
            while(pResult[i]>9)          //循环判断进位条件
            {
                nCarryBitPrice=pResult[i]/10;  //进位值
                pResult[i]=pResult[i]%10;
                i++;
                pResult[i]=nCarryBitPrice;
            }
        }

    }
}

/**************************************************************************
* 功能   :打印输出结果
* 参数   :int pResult[],int nPos,double dblFinish,double dblStart
* 返回值 :无
* 作者   :韩逸
* 修改时间:20161019
**************************************************************************/
void fnPrintResult(int pResult[],int nPos,double dblStart,double dblFinish)
{
    int i=0;
    printf("%d位阶乘:rn",NUMBER);
    nPos=nPos;

    for (i=nPos;i>=0;i--)
    {
        printf("%d",pResult[i]);
    }
    printf("rn");
    printf("位数:%drn",nPos+1);      
    printf("程序运行时间:%frn",(dblFinish-dblStart)/CLOCKS_PER_SEC);
    
}

image

本文固定链接: http://blog.050k.com/?p=166 | RotShell's Blog

C语言版大数阶乘:等您坐沙发呢!

发表评论

快捷键:Ctrl+Enter