实际题目
本题要求实现一个打印非负整数阶乘的函数。
函数接口定义:
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 void Print_Factorial ( const int N ){ 2 int a[3000]; 3 int n=N; 4 if(n<0||n>1000){ 5 printf("Invalid input"); 6 return 0; 7 } 8 if(n==0){ 9 printf("1"); 10 return 0; 11 } 12 else{ 13 int w=0; 14 int i=0, j=0; 15 int t=n; 16 int k=0; // 表示数据的位数。 17 18 i=0, k=0; 19 while(t) //把数字按位数传入数组 20 { 21 a[i++] = t%10; 22 t/=10; 23 k++; 24 } 25 26 for (j=n-1; j>1; j--) //开始阶乘 27 { 28 w=0; // 表示进位 29 for (i=0; i<k; i++) 30 { 31 t = a[i]*j+w; //每个位数乘乘数因子+是否进位 32 a[i] = t%10; 33 w = t/10; 34 } 35 36 while(w) //需要进位了 37 { 38 a[i++] = w%10; 39 w/=10; 40 k++; 41 } 42 } 43 int ttt=0; 44 int ii=0; 45 46 for (ii=k-1; ii>=0; ii--) 47 { 48 printf("%d",a[ii]); 49 } 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 } 66 return 0; 67 68 }
知识点分析
求阶乘,数过大,使用了数组进行存储
例子中1000阶乘大约2500位,所以使用数组a[3000]
建立一个计算的函数
int fanc(int n)
{
int w=0;
int i=0, j=0;
int t=n;
int k=0; // 表示数据的位数。
i=0, k=0;
while(t) //把数字按位数传入数组
{
a[i++] = t%10;
t/=10;
k++;
}
for (j=n-1; j>1; j--) //开始阶乘
{
w=0; // 表示进位
for (i=0; i<k; i++)
{
t = a[i]*j+w; //每个位数乘乘数因子+是否进位
a[i] = t%10;
w = t/10;
}
while(w) //需要进位了
{
a[i++] = w%10;
w/=10;
k++;
}
}
return k;
}
建立一个打印的函数
个位存在数组第一个位置,十位存在第二个,以此类推,
所以输出的时候要反向输出。
123是按照 3 2 1存储的
void show(int k)
{
int i=0;
printf("位数 %d 位\n",k);
for (i=k-1; i>=0; i--)
{
printf("%d",a[i]);
}
}
引用博客
链接:
引用代码
1 // 1000 的阶乘 2568 位 2 #include <stdio.h> 3 4 int a[3000]; 5 6 void show(int k) 7 { 8 int i=0; 9 printf("位数 %d 位\n",k); 10 for (i=k-1; i>=0; i--) 11 { 12 printf("%d",a[i]); 13 } 14 } 15 16 int fanc(int n) 17 { 18 int w=0; 19 int i=0, j=0; 20 int t=n; 21 int k=0; // 表示数据的位数。 22 23 i=0, k=0; 24 while(t) 25 { 26 a[i++] = t%10; 27 t/=10; 28 k++; 29 } 30 31 for (j=n-1; j>1; j--) 32 { 33 w=0; // 表示进位 34 for (i=0; i<k; i++) 35 { 36 t = a[i]*j+w; 37 a[i] = t%10; 38 w = t/10; 39 } 40 41 while(w) 42 { 43 a[i++] = w%10; 44 w/=10; 45 k++; 46 } 47 } 48 return k; 49 } 50 51 52 int main() 53 { 54 int n; 55 int k=0; 56 57 scanf("%d",&n); 58 k = fanc(n); 59 show(k); 60 printf("\n"); 61 return 0; 62 }