解题思路:
    我是一个初学者,只学到数组,所以用了数组的知识。

    就是,用数组储存。个位存在数组最后(因为这个结果会一直在增大,你根本不知道会达到多少位)。然后,思想就是,像我们在草稿纸上用乘法竖式算乘法一个样子。比如乘以3,被乘数每一个数字都要与3相乘(从个位开始嘛),然后,超过9要进啊,(比如27,就要进2;18就要进1),然后,我用了digit[]数组来储存要进的数。


    至于我里面的5660这些数怎么来。我是先给a[]数组弄一个很长的长度,比如10000、6000;但是我们输出,前面不能有多余的0 啊,所以,输出1977的阶乘后,我就缩小数组的长度,直到前面没有多余的0.

注意事项:

     这个结果位数高达5千多位。

要注意数组的长度,不要溢出了,注意储存是的顺序(顺序还是倒序)。

注意,digit[]的长度比a[]的长度大一位。是为了在写循环体时个位和其他位(如百位,千位)一致。

1和任何数相乘均为数本身,故不做乘1运算无所谓。


参考代码:


#include<stdio.h>

int main()

{

int a[5660],i,j,digit[5661];

for(i=0;i<5659;i++)a[i]=0;

for(a[5659]=1,i=2;i<=1977;i++)

{

for(j=5659,digit[5660]=0;j>=0;j-- )

{

a[j]=a[j]*i+digit[j+1];

digit[j]=a[j]/10;

a[j]=a[j]%10;

}


}

for(i=0;i<=5659;i++) printf("%d",a[i]);

printf("\n");



return 0;

}


点赞(7)
 

0.0分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 3 条评论

宝石叔叔 6年前 回复TA
你那个digit数组根本不用开的,一个整形变量就可以了
我爱打码 7年前 回复TA
嗯……可以这么说……在过程中算出了一共多少位后,可以把数组的长度缩短到刚刚好的这个长度
电竞李易峰 7年前 回复TA
这代码是编代码过程中算出5660的然后省略了求5660的过程吗