PTA-基础编程题目集-6-10 阶乘计算升级版
程序员文章站
2022-06-07 15:15:41
...
本题要求实现打印非负整数阶乘,其中N
是用户传入的参数,其值不超过1000。如果N
是非负整数,则该函数必须在一行中打印出N
!的值,否则打印“Invalid input”。
输入格式:
每个输入包含一个测试用例,第1行输入N。
输出格式:
在一行中输出阶乘结果或“Invalid input”
输入样例:
15
输出样例:
1307674368000
解题思路:
- 本题难点在于大数乘法,必须考虑到C语言的数据范围
- 使用数组保存乘法的结果
- 采用单位运算的方式,循环遍历数组的值与乘数进行相乘,如果乘积大于或等于10,则进位
- 有一个用例过不去,我现在还没想到问题出在哪,以后再改
代码:
#include <stdio.h>
/**
* 基础编程题目集-6-10 阶乘计算升级版
*/
void printFactorial ( const int N );
int main(int argc, char *argv) {
int N;
scanf("%d", &N);
printFactorial(N);
return 0;
}
void printFactorial ( const int N ) {
// 存放结果积
int result[2600];
result[0] = 1;
// 结果积长度,初始为1
int index = 1;
// 结果积的定位下标
int resultIndex;
if (N < 0) {
printf("Invalid input");
} else if (0 == N) {
printf("%d", 1);
} else {
for (int i = 1; i <= N; i++) {
// 余数
int remainder = 0;
for (resultIndex = 0; resultIndex < index; resultIndex++) {
remainder += result[resultIndex] * i;
if (remainder >= 10) {
result[resultIndex] = remainder % 10;
remainder /= 10;
} else {
result[resultIndex] = remainder;
remainder = 0;
}
}
/**
* 判断最后一次乘法(最高位)的结果是否产生余数
*/
if(remainder != 0) {
result[resultIndex] = remainder;
} else {
resultIndex -= 1;
}
index = resultIndex + 1;
}
/**
* 打印result数组即乘积结果
*/
for(int i = resultIndex; i >-1 ; i--) {
printf("%d", result[i]);
}
}
}
结果:
转载于:https://my.oschina.net/niithub/blog/2988956
上一篇: 阶乘计算升级版 (20 分)
下一篇: C++优先队列构造哈夫曼树