解题思路:
大数据阶乘,我们用数组存储结果,这题用长度为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 条评论

TheMagician 11月前 回复TA
@TheMagician 这是我自己根据思路做的,x表示位数,i和y是两个循环,n是一位数*i大于10时溢出的值;
TheMagician 11月前 回复TA
#include<stdio.h>
int main()
{
   int a[6000],i,x,y,n=0;
   a[0]=1;x=1;
   for(i=1;i<=1977;i++)
   {
       for(y=0;y<=x;y++)
       {
           a[y]*=i;a[y]+=n;n=0;
           if(a[x-1]>=10)
           x++;
           if(a[y]>=10)
           {
               n=a[y]/10;
                a[y]%=10;
           }
       }
   }
   for(i=x-1;i>=0;i--)
   {
       printf("%d",a[i]);
   }
   
}
wind 11月前 回复TA
@dusk jc[i]后面超过100
赵xinran 1年前 回复TA
高精度嘛
D5 2年前 回复TA
#include<stdio.h>
void mul(int n,int *num)
{
    for(int i=0;num[i]!=-1;i++)
    {
        num[i]*=n;
    }
    for(int i=0;num[i]!=-1;i++)
    {
        if(num[i]>=10)
        {
            if(num[i+1]==-1)
            {
                num[i+1]=0;
            }
            num[i+1]+=num[i]/10;
            num[i]%=10;
        }
    }
}
int main()
{
    int num[6000]={1};
    for(int i=1;i<6000;i++)
    {
        num[i]=-1;
    }
    for(int i=1;i<=1977;i++)
    {
        mul(i,num);
    }
    for(int i=6000-1;i>=0;i--)
    {
        if(num[i]!=-1)
        {
            printf("%d",num[i]);
Sapphire 2年前 回复TA
@妓科二班朴成性 @jorhelp 对,这个变量是没有用的(来自2022年的回复哈哈)
蠢狗君 3年前 回复TA
牛啤!!
dusk 4年前 回复TA
为什么我的就不行:
#include <stdio.h>
#include <stdlib.h>
 
int jc[5660]={0};
int weishu=1;

void function (int key);



int main(){
	 	
 	jc[0]=1;	//初始化
	for(int i=2;i<=1997;i++){
		function(i);
	} 
	for(int j=weishu-1;j>=0;j--){
		printf("%d",jc[j]);
	}
	return 0;
} 

void function(int key){
	
	for(int i=0;i<weishu;i++){	 
		jc[i]*=key; 
	}
	for(int i=0;i<weishu;i++){
		if(jc[i]/10&&(i==weishu-1) ){	 
			weishu++; 
		}
		jc[i+1]+=jc[i]/10;
		jc[i]%=10;	 
	
	}
 
	
}
Sierra 5年前 回复TA
很聪明的解法,非常简介!
妓科二班朴成性 5年前 回复TA
@妓科二班朴成性 @181134024 额,jinwei 这个变量好像没有使用啊