[PTA]6-10 阶乘计算升级版
Posted Spring-_-Bear
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[PTA]6-10 阶乘计算升级版相关的知识,希望对你有一定的参考价值。
本题要求实现一个打印非负整数阶乘的函数。
函数接口定义:
void Print_Factorial ( const int N );
其中N是用户传入的参数,其值不超过1000。如果N是非负整数,则该函数必须在一行中打印出N!的值,否则打印“Invalid input”。
裁判测试程序样例:
#include <stdio.h>
void Print_Factorial ( const int N );
int main()
{
int N;
scanf("%d", &N);
Print_Factorial(N);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
15
输出样例:
1307674368000
- 提交结果:
- 源码:
#include <stdio.h>
#define MAXN 3000
void Print_Factorial(const int N);
int main()
{
int N;
scanf("%d", &N);
Print_Factorial(N);
return 0;
}
/* 你的代码将被嵌在这里 */
void Print_Factorial(const int N) // 计算N!,模拟乘法运算
{
if (N < 0) // 负数没有阶乘
{
printf("Invalid input");
}
else if (N == 0) // 0!为1
{
printf("%d", 1);
}
else // 1!~1000!
{
// 1000!最多有2568位,定义MAXN为3000
int num[MAXN] = { 0 };
// maxIndex为最大数组下标,即2999
int maxIndex = MAXN - 1;
// curIndex为当前最小下标
int curIndex = maxIndex;
// 初始化最后一位值为1,其余为0
num[maxIndex] = 1;
// 计算N!,依次从1乘到N
for (int i = 1; i <= N; i++)
{
// 进位
int carry = 0;
int flag = 0;
for (int j = maxIndex; j >= curIndex; j--)
{
num[j] = num[j] * i + carry;
// 进位值存在且中途已经使用过一次,则进位值重新赋值为0
if (flag)
{
carry = 0;
}
if (num[j] >= 10)
{
// 向前的进位
carry = num[j] / 10;
// 当前位
num[j] %= 10;
// 当前下标到最小下标且还要进位,则curIndex--
if (j == curIndex)
{
curIndex--;
}
// 进位值存在则flag为1
flag = 1;
}
}
}
// 输出N!
for (int i = curIndex; i <= maxIndex; i++)
{
printf("%d", num[i]);
}
}
return 0;
}
以上是关于[PTA]6-10 阶乘计算升级版的主要内容,如果未能解决你的问题,请参考以下文章