/*大数问题
*用一个整型数组表示一个大数,数组的每个元素储存大数的一位数字,则实际的大数d表示为:
*d=a[k]*10的k-1次幂+a[k-1]*10的k-2次幂+......+a[2]*10+a[1].
*其中a[0]保存该大数的位数.
*一个数N的阶乘(N为无穷大)
*/
Code
// BigNums.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
/**//*大数问题
*用一个整型数组表示一个大数,数组的每个元素储存大数的一位数字,则实际的大数d表示为:
*d=a[k]*10的k-1次幂+a[k-1]*10的k-2次幂++a[2]*10+a[1].
*其中a[0]保存该大数的位数.
*一个数N的阶乘(N为无穷大)
*/
long Factorial(int);
void BigNumsFactorial(int[], int);
int _tmain(int argc, _TCHAR* argv[])
{
int nums[100];
memset(nums, 0, sizeof(nums));
nums[0] = 1;//大数的位数
nums[1] = 1;//大数初始值
//cout << Factorial(10) << endl;
BigNumsFactorial(nums, 50);
return 0;
}
void BigNumsFactorial(int result[], int n)
{
int temp[100];
int offset, multiplier, carry, times;
for(int i = 2;i <= n;i++)
{
memset(temp, 0, sizeof(temp));//Reset temp[]数组
times = i;//每次除10
offset = 0;//没除10一次offset加1
while(times != 0)
{
multiplier = times % 10;//获取乘数
times = times / 10;
offset ++;//偏移位数
carry = 0;//进位
//用大数乘以multiplier,并将结果加到变量temp[]中
int j;
for(j = 0;j < result[0];j++)
{//j + offset从1开始
temp[j + offset] += (multiplier * result[j + 1] + carry) % 10;//当前位结果存放的temp[j]中
carry = (multiplier * result[j + 1] + carry) / 10;//记录进位
}
if(carry > 0)
{
temp[j + offset] = carry;
temp[0] = j + offset;
}
else
{
temp[0] = j + offset - 1;
}
}
for(int i = temp[0];i >= 0;i--)
{
result[i] = temp[i];
}
}
cout << "length: "<< temp[0] << endl;;
for(int i = temp[0];i > 0;i--)
{
cout << temp[i];
}
}
long Factorial(int num)
{
if(num == 1)
{
return 1;
}
else
{
return num * Factorial(num - 1);
}
}