C语言实现大数阶乘

 

   今天上班有点空闲时间, 想起了大学学数据结构时的一道题目, 实现大数阶乘. 于是就试了一下,

  

   使用VC6.0

   计算小于13的数的阶乘时递归很容易实现代码如下:

     int Factorial(int n)
    {
         if(n <= 1) return 1;
         return n * Factorial(n - 1);
    }

 

    进行大数阶乘运算时简单实现: 用整数数组来进行数据存储, 一个unsigned int 存储小于   MAX_INT 的数据.即10的9次方.数组长度为LENGTH ,就可以保存LENGTH *9位十进制结果的数据.   把LENGTH设为20,则就最多可以保存180位十进制数据.能算110! 这样如果用链表来实现的话会更好些.

     运算过程中用加法来运算乘法. 代码如下. 

  

   // Factorial.h

   #define LENGTH   20
   #define MAX_INT  1000000000

    #ifdef _cplusplus
        extern "C" {
    #endif
        void InitFactorial(void);
         void Factorial_Run(int n);
        void Factorial_Print(void);
    #ifdef _cplusplus
    }    
    #endif

 

     // Factorial.c

    unsigned int Result[LENGTH];
    unsigned int retTemp[LENGTH];

    void InitFactorial(void)
    {
         int i = 0;
         for(i = 1; i < LENGTH; i++)
         {
              Result[i] = 0; 
         }
         Result[0] = 1;
    }

    static void AddOneTime(void)
    {
         int i = 0;
         for(i = 0 ; i < LENGTH; i++)
         {
              Result[i] += retTemp[i];
              if(Result[i] >= MAX_INT) 
              {
                   if(i >= LENGTH - 1)
                     {
                        printf("LENGTH too short!/n");
                        exit(0);
                      }
                       else
                      {
                           Result[i+1]++;
                            Result[i] -= MAX_INT;
                       }
              }
         }
    }
static void ReadyToCalc(void)
{
     int i = 0;
     for(i = 0; i < LENGTH; i++)
          retTemp[i] = Result[i];
}

void Factorial_Run(int n)
{
     int i= 0;
     if(n == 1) return;
     ReadyToCalc();
     for(i = 1; i < n; i++)
     {
          AddOneTime();
     }
     Factorial_Run(n-1);
}

void Factorial_Print(void)
{
     int first = 1;
     int i = 0;
     printf("the Result : ");
     for(i = LENGTH; i > 0; i--)
     {
          if(!first)
          {
               printf("%09d", Result[i-1]);
          }
          if(Result[i-1] != 0 && first)
          {
               printf("%d", Result[i-1]);
               first = 0;
          } 
     }
     printf("/n");
}

 

//main.cpp

 

#include <stdio.h>
#include <iostream>
extern "C"{
#include "factorial.h"
}
using namespace std;

 

#define TEST_NUMBER  110

int Factorial(int n)
{
 if(n <= 1) return 1;
 return n * Factorial(n - 1);
}

int main(void)
{

 InitFactorial();
 Factorial_Run(TEST_NUMBER);
 Factorial_Print();
  //  printf("%d/n", Factorial(TEST_NUMBER));

 cout<<"liu zhiliang"<<endl;
 
 return 0;
}

 

the Result : 1588245541522742940425370312709077287172441023447356320758174831844
45671629481830309599601315176785204792436726381799902085211486234222668767576239
11219200000000000000000000000000
liu zhiliang
Press any key to continue

 

这只是初步实现代码. 还有等改进.

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值