阶乘
函数printFactorial(int n)的功能是输出非负整数n的阶乘,n的值不超过1000,对于不满足输入要求的n值,输出“Invalid input”,否则在一行上输出n!。
裁判服务器中的测试程序及样例如下:
#include <stdio.h>
void printFactorial(int n);
int main(){
int n;
scanf("%d", &n);
printFactorial(n);
return 0;
}
/*你提交的函数定义将放在此位置 */
输入样例:15
输出样例:1307674368000
#include <stdio.h>
void Print_Factorial(const int N);
int main()
{
int N;
scanf("%d", &N);
Print_Factorial(N);
return 0;
}
/* 你的代码将被嵌在这里 */
void Print_Factorial(const int N)
{
if (N < 0) printf("Invalid input");
else
{
int a[5555] = { 0 };
a[1] = 1;
int i, j, len=1, carry = 0,n=N;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= len; j++)
{
int t = a[j] * i + carry;
a[j] = t % 10;
carry = t / 10;
}
while (carry)
{
a[j++] = carry % 10;
carry /= 10;
len++;
}
}
for (; len > 0; len--) printf("%d", a[len]);
}
}
小小总结一下:
- 输出的数字值太大,无论是long,还是long long都无法表示。因此考虑使用数组,将每一位储存在数组中,再按序打印数组。
- 使用数组意味着将每位数字与其他位数字隔离开来,就要讨论进位问题。分析进位的过程,本位保留%10的值,高一位进/10的值,依此类推。
- 当计算到最高位后,仍有进位时,继续增加数组长度,新增加高位数组元素,储存进位数
- 最高位后开辟长度的模块,是放在 *i 的大循环内部还是外部?应该放在内部,因为每乘一次数字都可能存在增加位数的情况。
我刚刚尝试写一下上一篇字符串压缩的代码,发现自己又结果错误且没找到原因,悲伤了