解题思路:
因为n<=50;当n>20最大存储整数类型long long也存储不下,导致造成数据溢出。所以运用高精度乘法与加法计算n的阶乘和
参考代码:
#include <iostream>
#include <string.h>
using namespace std;
int m[520],j,sum[520];
void jishuanjiecheng(int n)//高精度乘法:计算n的阶乘
{
m[1] = 1;
m[0] = 1;//存储位数
for (int i = 1; i <= n; i++)
{
for (j = 1; j <= m[0]; j++)m[j] *= i;
for (j = 1; j <= m[0]; j++)
{
m[j + 1] += m[j] / 10;
m[j] %= 10;
}
if (m[j] > 0)
{
while (m[j] >= 10)
{
m[j + 1] += m[j] / 10;
m[j] %= 10;
j++;
}
m[0] = j;
}
}
}
void GEM(int n)
{
sum[0] = 1;
for (int i = 1; i <= n; i++)
{
jishuanjiecheng(i);
for ( j=1; j <=m[0]; j++)sum[j] += m[j];
if (i == 1 || sum[0] < m[0])sum[0] = m[0];
for ( j=1; j <=sum[0]; j++)
{
sum[j + 1] += sum[j] / 10;
sum[j] %= 10;
}
if (sum[j] > 0)
{
while (sum[j] >=10)
{
sum[j + 1] += sum[j] / 10;
sum[j] %= 10;
j++;
}
sum[0] = j;
}
memset(m, 0, sizeof(m));
}
}
int main()
{
int n;
cin >> n;
GEM(n);
for (int i = sum[0]; i > 0; i--)cout << sum[i];
return 0;
}
0.0分
1 人评分
十->二进制转换 (C语言代码)浏览:1443 |
C语言程序设计教程(第三版)课后习题7.2 (C语言代码)浏览:1175 |
C语言程序设计教程(第三版)课后习题7.5 (C语言代码)浏览:670 |
大神老白 (C语言代码)浏览:694 |
时间转换 (Java代码)浏览:618 |
【亲和数】 (C语言代码)浏览:530 |
C语言程序设计教程(第三版)课后习题6.4 (C语言代码)浏览:781 |
C语言程序设计教程(第三版)课后习题6.10 (C语言代码)浏览:827 |
C语言考试练习题_一元二次方程 (C语言代码)浏览:606 |
Hello, world! (C++代码)浏览:1778 |