浙大版《C语言程序设计(第4版)》题目集参考答案
本题要求实现一个打印非负整数阶乘的函数。
函数接口定义:
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
提交结果:
基本思路:
1.由于阶乘的结果超过了弄弄整形,所以考虑用数组来接收
2.计算时,阶层每一位乘以因数用变量存储结果取出它的尾数加上进位的数的尾数,在计算出需要进位的数 详细解析
代码实现:
void Print_Factorial ( const int N )
{
if(N<0||N>1000)
{
printf("Invalid input");
}
else
{
int fact[3001]={0};
fact[0]=1;
int factlen=1;
for(int factor=2;factor<=N;factor++)
{
int carry=0;//进到高位的数字
int multiplied=0;//一位数字乘因数后的值
int calcDigit=0;//某一个数位的值
for(int j=0;j<factlen;j++)
{
multiplied=fact[j]*factor;
calcDigit=carry%10+multiplied%10;
carry=carry/10+multiplied/10;
if(calcDigit>=10)
{
carry+=calcDigit/10;
calcDigit%=10;
}
fact[j]=calcDigit;
if(j>=factlen-1&&carry>0)
{
factlen++;
}
}
}
for(int i=factlen-1;i>=0;i--)
{
printf("%d",fact[i]);
}
}
}
欢迎提问和纠错,共同讨论一起进步!