函数接口定义:
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;
}
/* 你的代码将被嵌在这里 */
问题: 这个题目出现的问题主要是当N数字为最大值的时候计算不出来那么应该怎么办。
解法: 通过数组来保存结果的每一位。
具体解释: 题目计算的是阶乘。如N! =1×2×3×4×5…×n。
要点: 数组保存结果值
数组保存的是当前结果值,随着每一次的乘,数组值改变。
一个位置值代表数组中哪一位进行乘法运算。
乘法原理:当前值乘以一个值->数组(通过乘以数组中的每一位),如果大于十那么就要进位,留下个位数来覆盖此位置的数。
有一个结果值,一个进位值,一个覆盖值,一个位置值。
结果值 = 乘的结果+进位值
进位值 = 结果值 / 10
覆盖值(覆盖当前位置值) = 结果值 % 10
给出代码:
#include <stdio.h>
void Print_Factorial(int N){
int a[3000];
int temp,num,digit; //temp:每一位的结果 num:进位 digit:结果的位数
int i,j;
a[0]=1;
digit=1; //从第1位开始
if(N>=0) {
for(int i = 2; i<=N; i++)
{
num = 0 ;
for(int j = 0;j<digit; j++)
{
temp = a[j]*i+num;
num = temp/10;
a[j] = temp%10;
}
while(num)
{
a[digit] = num%10;
num/=10;
digit++;
}
}
for(i=digit-1;i>=0;i--){
printf("%d",a[i]);
}
}
else printf("Invalid input");
}