- 题目地址
- 题目分析:
1.预估1000!的位数~~进行放大估计~~1000^900&100^100即是3*900+2*100+o<3000位;
2.这里显然需要利用数组来保存数字并进行运算,让数组成员每个保存3位数字(题目条件已告知参数小于1000),我们构建1200个成员的数组(3600位);
3.难点在于我们对数组成员间相乘、进位的考虑,这里容易误入歧途;这里本质上来讲,与就是把十进制转化为千进制,而转化为千进制的一个重要原因在于我们将多位数*多位数的复杂情况转化为了单位数*多位数的简单情况进行运算,具体细节见下面代码。
- 我的代码
void Print_Factorial(const int N)
{
int n = N;
if (n < 0)
printf("%s", "Invalid input");
if (n == 0 || n == 1)
printf("%d", 1);
/*
数字运算时:
该算法通过数组控制,使得每次都进行 同位数*同位数 (可以小,不能大)运算,
且将 大数乘法 -> 个位*多位。
同位数*同位数=本位数+进位数:
(在 个位*多位 的情况下)
进位数+进阶本位数 < 进位值(一个简单的乘法规律)
从而不产生多次相加的连续进位问题
*/
if (n > 1)
{
int a[1200] = { 1,0 }, len = 1;//一个数组,一个位数指标len
for (int c, j; n > 1; n--)//这里的进阶c设计的非常巧妙
{
for (j = 0, c = 0; j < len; j++)//通过j让多位的每位被乘
{
int p = a[j] * n + c;
a[j] = p % 1000;
c = p / 1000;
}
c > 0 ? a[j] = c, len++ : 0;//一次单位*多位的最后一次c的运算
}
printf("%d", a[len - 1]);//注意打印格式的规范化
for (int m = len - 2; m >= 0; m--)
printf("%03d", a[m]);
}
}
- 参考文章:4行代码计算9999的阶乘