题目链接:6-10 阶乘计算升级版
一. 题目
1. 题目
2. 裁判程序样例
3. 输入输出样例
4. 限制
二、代码
1. 代码实现
#include <malloc.h>
#include <string.h>
// 将字符串表示的大整数乘以一个单独的数字,并更新字符串
void multiplyByDigit(char *num, int digit) {
size_t len = strlen(num);
int carry = 0;
for (size_t i = len; i > 0; i--) {
int product = (num[i - 1] - '0') * digit + carry;
num[i - 1] = product % 10 + '0';
carry = product / 10;
}
// 存在剩余的进位,此循环存在优化空间
while (carry > 0) { // 存在大于10进位的情况,故使用循环
num = realloc(num, (len + 2) * sizeof(char)); // +2 for carry and '\0'
num[len + 1] = '\0';
for (size_t i = 0; i < len; ++i) { // 整体右移1位
num[len - i] = num[len - i - 1];
}
num[0] = carry % 10 + '0';
carry /= 10;
len += 2;
}
}
// 打印非负整数的阶乘函数接口
void Print_Factorial(const int N) {
if (N < 0) {
printf ("Invalid input\n");
return;
}
// 初始化阶乘结果为"1"
char *factorial = malloc(2 * sizeof(char));
factorial[0] = '1';
factorial[1] = '\0';
// 计算阶乘
for (int i = 2; i <= N; ++i) {
multiplyByDigit(factorial, i);
}
// 打印结果
printf("%s\n", factorial);
// 释放内存
free(factorial);
}
2. 提交结果
3. 优化空间
- 对于在阶乘结果在64位范围内时,可直接使用乘法计算1
- 处理进位时,可首先判断进位位数,再依次进行realloc、移位、更新结果
三、总结
- 本题实现了大数阶乘
- 同样的思想可用于大数乘法等大数运算
甚至128位的也可以,需要支持__int128_t类型 ↩︎