/******************************************************************************
*@Description: 大数阶乘
* 时间限制:3000 ms | 内存限制:65535 KB
* 难度:3
* 描述
* 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
* 输入
* 输入一个整数m(0<m<=5000)
* 输出
* 输出m的阶乘,并在输出结束之后输入一个换行符
* 样例输入
* 50
* 样例输出
* 30414093201713378043612608166064768844377641568960512000000000000
*@Author: steven
*@Datetime: 2013-07-03
********************************************************************************/
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
const int N = 20000;
int a[N] = {1};
int aSize = 1;
void convert(int *dstArray, int i, int *nBit);//将一个整数的各个位分离放入一个整型数组中,并设置标志位nBit
int calculate(int *temp, int *b, int nBit);
int main()
{
int n;
int nBit = 0; //用来标志输入的数的位数
int b[3];
int m = 0; //用来记录最后计算结果的数的位数
int temp[N];
int i, k;
cin>>n;
for (i = 2; i <= n; i++)
{
//复制数据到临时数组里面
for (k = 0; k < aSize; k++)
{
temp[k] = a[k];
}
convert(b, i, &nBit);
m = calculate(temp, b, nBit);
}
//输出最后结果
for (i = m; i >= 0; i--)
{
cout<<a[i];
}
cout<<endl;
// system("pause");
return 0;
}
void convert(int *dstArray, int n, int *nBit)
{
int i;
if (n < 10)
{
*nBit = 1;
}
else if (n < 100)
{
*nBit = 2;
}
else if (n < 1000)
{
*nBit = 3;
}
else
{
*nBit = 4;
}
for (i = 0 ; i < *nBit; i++)
{
dstArray[i] = n % 10;
n /= 10;
}
}
int calculate(int *temp, int *b, int nBit)
{
int i, j, l, k;
bool flags = false;
//相乘运算
if (nBit == 1)
{
for (i = 0; i < aSize; i++)
{
for ( j = 0; j < nBit; j++)
{
a[i+j] = temp[i] * b[j];
}
}
}
else
{
for (l = 0; l < aSize; l++)
{
a[l] = 0;
}
for (i = 0; i < aSize; i++)
{
for (j = 0; j < nBit; j++)
{
a[i+j] += temp[i] * b[j];
}
}
}
aSize = i + j - 1;
//进位
for (k = 0; k < i+j-1; k++)
{
if (a[k] > 9)
{
a[k+1] += a[k] / 10;
if (k == i+j-2)
{
flags = true;
}
}
a[k] %= 10;
}
if (flags)
{
aSize++;
}
for (i = k; i>0; i--)
{
if (a[i] == 0)
{
k--;
}
else
{
break;
}
}
return k;
}
*@Description: 大数阶乘
* 时间限制:3000 ms | 内存限制:65535 KB
* 难度:3
* 描述
* 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
* 输入
* 输入一个整数m(0<m<=5000)
* 输出
* 输出m的阶乘,并在输出结束之后输入一个换行符
* 样例输入
* 50
* 样例输出
* 30414093201713378043612608166064768844377641568960512000000000000
*@Author: steven
*@Datetime: 2013-07-03
********************************************************************************/
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
const int N = 20000;
int a[N] = {1};
int aSize = 1;
void convert(int *dstArray, int i, int *nBit);//将一个整数的各个位分离放入一个整型数组中,并设置标志位nBit
int calculate(int *temp, int *b, int nBit);
int main()
{
int n;
int nBit = 0; //用来标志输入的数的位数
int b[3];
int m = 0; //用来记录最后计算结果的数的位数
int temp[N];
int i, k;
cin>>n;
for (i = 2; i <= n; i++)
{
//复制数据到临时数组里面
for (k = 0; k < aSize; k++)
{
temp[k] = a[k];
}
convert(b, i, &nBit);
m = calculate(temp, b, nBit);
}
//输出最后结果
for (i = m; i >= 0; i--)
{
cout<<a[i];
}
cout<<endl;
// system("pause");
return 0;
}
void convert(int *dstArray, int n, int *nBit)
{
int i;
if (n < 10)
{
*nBit = 1;
}
else if (n < 100)
{
*nBit = 2;
}
else if (n < 1000)
{
*nBit = 3;
}
else
{
*nBit = 4;
}
for (i = 0 ; i < *nBit; i++)
{
dstArray[i] = n % 10;
n /= 10;
}
}
int calculate(int *temp, int *b, int nBit)
{
int i, j, l, k;
bool flags = false;
//相乘运算
if (nBit == 1)
{
for (i = 0; i < aSize; i++)
{
for ( j = 0; j < nBit; j++)
{
a[i+j] = temp[i] * b[j];
}
}
}
else
{
for (l = 0; l < aSize; l++)
{
a[l] = 0;
}
for (i = 0; i < aSize; i++)
{
for (j = 0; j < nBit; j++)
{
a[i+j] += temp[i] * b[j];
}
}
}
aSize = i + j - 1;
//进位
for (k = 0; k < i+j-1; k++)
{
if (a[k] > 9)
{
a[k+1] += a[k] / 10;
if (k == i+j-2)
{
flags = true;
}
}
a[k] %= 10;
}
if (flags)
{
aSize++;
}
for (i = k; i>0; i--)
{
if (a[i] == 0)
{
k--;
}
else
{
break;
}
}
return k;
}