实际题目
本题要求实现一个打印非负整数阶乘的函数。
函数接口定义:
void Print_Factorial ( const int N );
其中N是用户传入的参数,其值不超过1000。如果N是非负整数,则该函数必须在一行中打印出N!的值,否则打印“Invalid input”。
裁判测试程序样例:
#include
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 intN ){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
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
{
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
3
4 int a[3000];5
6 void show(intk)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(intn)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
41 while(w)42 {43 a[i++] = w%10;44 w/=10;45 k++;46 }47 }48 returnk;49 }50
51
52 intmain()53 {54 intn;55 int k=0;56
57 scanf("%d",&n);58 k =fanc(n);59 show(k);60 printf("\n");61 return 0;62 }