您的位置:首页 > 编程语言 > C语言/C++

C语言实现大数阶乘

2008-10-15 13:20 423 查看
今天上班有点空闲时间, 想起了大学学数据结构时的一道题目, 实现大数阶乘. 于是就试了一下,

使用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

这只是初步实现代码. 还有等改进.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: