解题思路:
我是一个初学者,只学到数组,所以用了数组的知识。
就是,用数组储存。个位存在数组最后(因为这个结果会一直在增大,你根本不知道会达到多少位)。然后,思想就是,像我们在草稿纸上用乘法竖式算乘法一个样子。比如乘以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;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复