Manchester


私信TA

用户名:wenyajie

访问量:333886

签 名:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

等  级
排  名 1
经  验 65834
参赛次数 1
文章发表 188
年  龄 0
在职情况 学生
学  校 Xiamen University
专  业 计算机科学

  自我简介:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

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

别忘点赞喏-.-

 

0.0分

58 人评分

新上线《蓝桥杯辅导》课程,近五年的蓝桥杯省赛与国赛真题都有,从读题开始理解题意、梳理思路、实现代码再提交评测全过程,可有效提升获奖比例甚至进国赛!课程介绍、试听请猛击这里

  评论区

#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]);
   }
   
}
2024-01-31 20:01:07
高精度嘛
2023-02-13 01:06:41
#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]);
2022-09-12 15:11:58
牛啤!!
2021-07-30 16:29:57
为什么我的就不行:
#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;	 
	
	}
 
	
}
2020-10-23 15:20:33
很聪明的解法,非常简介!
2019-11-08 19:27:07
第22行好像没什么用??
2018-08-25 00:03:51
  • «
  • 1
  • »