解题思路:
大数据阶乘,我们用数组存储结果,这题用长度为5660的数组 jc[5660] 刚好够存1977的阶乘;

1:定义变量weishu代表阶乘的结果所占的位数;

2:把整个数组(jc[])全赋值为0,再把0号元素(jc[0])置1,代表此时阶乘的值为1!,同时,weishu=1;

3:让数组依次乘i=2,3,4........1977  ,依次得到2!, 3!,4!.........1977!
具体乘法:

和我们数学乘法竖式一样的思路

让阶乘中每一位(0~weishu-1)都乘i,与我们手算不同的是,这里不先不进位,我们手算是乘一个进位一次;

乘完后,开始进位,

jc[j+1]+=jc[j]/10;
        jc[j]%=10;

(我们这里是把个位数存在0号位置,所以进位向后面进)

在进位的过程中,要更新weishu的值,因为在进位后阶乘结果位数改变;

if(jc[j]/10&&(j==weishu-1))   这个代码的意思就是,阶乘结果的最高(j==weishu-1代表最高位)位有进位
       weishu++;               则,阶乘结果位数加一位

进位结束后,整个数组jc[]里面有效位就是i的阶乘了,接着乘以i+1,重复上面过程就得到了i+1的阶乘..最后直1977!


注意事项:
0号元素对应为阶乘结果的个位数,输出结果时,倒着输出

参考代码:

#include <stdio.h>
int    jc[5660] = { 0 };
int    weishu = 1;
void function( int i );
/*-------------------------------------------------------*/

int main()
{
    jc[0] = 1;
    for ( int i = 2; i <= 1977; i++ )
        function( i );

    for ( int i = weishu - 1; i >= 0; i-- )
        printf( "%d", jc[i] );

    return(0);
}

/*-------------------------------------------------------*/
void function( int i )
{
    int jinwei;
    for ( int j = 0; j < weishu; j++ )
        jc[j] *= i;

    for ( int j = 0; j < weishu; j++ )
    {
        if ( jc[j] / 10 && (j == weishu - 1) )
            weishu++;
        jc[j + 1]    += jc[j] / 10;
        jc[j]        %= 10;
    }
}

别忘点赞喏-.-

点赞(43)
 

0.0分

43 人评分

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

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

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

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

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

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

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

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

评论列表 共有 12 条评论

李文博 5年前 回复TA
@妓科二班朴成性 有用啊,声明
妓科二班朴成性 6年前 回复TA
第22行好像没什么用??