#035 大数阶乘 PTA题目6-10 阶乘计算升级版 (20 分)

实际题目

本题要求实现一个打印非负整数阶乘的函数。

函数接口定义:

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]);
}
}

 

引用博客

链接:

大数运算_求1000的阶乘(C语言实现)

引用代码

 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 }  

 

posted @ 2019-04-29 11:08  韩旭051  阅读(1060)  评论(0编辑  收藏  举报