解题思路: 首先,题目中已经给了我们算法的大概思想,高精度计算,用数组实现。

 首先我们要知道数组每一个位置存该大数的一个数位 如果用char类型的数组,可以减小内存开销,但是须要处理字符与数字变换问题,由于本人比较懒,所以直接用了int类型的数组 

处理方法就按题目中给的方法来:

第一步:开辟好数组空间,这里我使用全局变量的方式,因为全局变量允许申请的连续空间要比局部变量长(原因我也不知道,也是偶然一次编码发现的),其次,一次申请,全局使用,节省空间。为了标记数组哪些位置被使用,哪些位置未使用,我采用利用-1标记未使用的方法。

第二步:编写主函数(main) 把预处理数据,函数调用,数据输出都先写好,然后我们的工作就直接落在数据处理函数上面了,强烈建议这样,千万不要养成什么东西都在main里面写的坏习惯。

第三步:编写数据处理函数,也就是我们要实现的算法,这里就按题目中的算法一步一步来,用数组每一位去乘以阶乘变量,然后看一下是否大于等于10 如果是则处理进位(单独保存进位值,并且把当前位置数值对十取余数) 

第四步:避免时间太长,建议第三部函数返回数字在数组中的长度,可避免一次循环搜索。



注意事项:

这里提一点 :千万注意一下,在你处理完一次当前计算时,是否还需要向最高位进位,也就是像 15X9 = 135 这种情况,当5x9 进位4 然后1x9 加上进位4 以后还需要向前继续进位!!而且题目要求的最大值是1000 可能还是不是进一位哦!!


而且为了避免一次进位对下一次的影响,我们需要在进位之后将进位变量置0  

再有一点,不论是阶乘计算还是什么,只要是有乘法的计算,应该避免出现0 ,除非题目要求你那样做。
参考代码:

变量定义: 全局:num[5000] 用来存放计算结果  

                    jcjs函数参数: num[] 保存结果的数组 。n: 要计算的n

                   jcjs: len :有效长度,也就是计算结果的数组长度。 i:阶乘从1-n的循环变量。 p结果数组的下标指针。 jw:进位值  

                    main: n 要计算n的阶乘 。len结果数组的有效长度 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
#include <stdlib.h>
int num[5000]; 
int jcjs(int num[],int n){
    num[0]=1;
    int len=1;
    int i;
    for(i=1;i<=n;++i){
        len=0;
        int p = 0;
        int jw=0;
        while(num[p]!=-1){ 
            num[p]*=i;
            num[p]+=jw;
            jw=0;  //进位加完置零 
            if(num[p]>=10){
                jw=num[p]/10;
                num[p]%=10;
            }
            p++;
            len++;
        }
        if(jw!=0){
            while(jw){ //进位值不一定是1位 要循环处理 
                num[p++]=jw%10;
                jw/=10;
                len++;
            }  
        }  
    }
    return len-1;
}
int main(int argc, char *argv[]) {
    int n;
    while(scanf("%d",&n)!=EOF){
        memset(num,-1,sizeof(num));
        int len = jcjs(num,n);
        for(len;len >=0;--len){
                printf("%d",num[len]); 
        }
        printf("\n");
    }
    return 0;
}


点赞(11)
 

9.2 分

6 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 7 条评论

uq_59601343180 2年前 回复TA
@追梦人 我滴神,666
uq_59601343180 2年前 回复TA
@追梦人 厉害
追梦人 2年前 回复TA
#include<stdio.h>
int a[2568],weishu=1;
void funtion(int i);
int main(void)
{
	int n,i;
	scanf("%d",&n);
	a[0]=1;
	for(i=2;i<=n;i++)
	funtion(i);
	for(i=weishu-1;i>=0;i--)
	printf("%d",a[i]);
}
void funtion(int i)
{
	int j;
	for(j=0;j<weishu;j++)
	a[j]*=i;
	for(j=0;j<weishu;j++)
	{
		if(a[j]/10&&j==weishu-1)
		weishu++;
		a[j+1]+=a[j]/10;
		a[j]=a[j]%10;
	}
}
Marchen 3年前 回复TA
@1421 哈哈哈哈哈哈1000!应该也就2500位左右
1421 5年前 回复TA
@1421 当我没说
1421 5年前 回复TA
5000位够吗,感觉太少了 起码得10w吧
wxj 6年前 回复TA
精辟,觉得还是用java比较简单,但是实现原理还是要弄懂得,哈哈哈~~~