微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用c语言求1000的阶乘中2的个数

#include<stdio.h>
#define N 1000
#define M 3000
void hmove(int arr[])
{
	int i;
	for(i=M;i>1;i--)
	{
		arr[i]=arr[i-2];
	}
	arr[0]=0;
	arr[1]=0;
}
void move(int arr[])
{
	int i;
	for(i=M;i>0;i--)
	{
		arr[i]=arr[i-1];
	}
	arr[0]=0;
}
void sum(int a[],int b[])
{
	int i,c;
	int flag = 0;
	for(i=0;i<M;i++)
	{
		c=a[i]+b[i]+flag;
		if(c>9)
		{
			a[i]=c%10;
			flag=c/10;
		}
		else
		{
			a[i]=c;
			flag=0;
		}
	}

}
void cheng(int arr[],int j)
{
	int i,flag=0,c;
	for(i=0;i<M;i++)
	{
		c=j*arr[i]+flag;
		if(c>9)
		{
			arr[i]=c%10;
			flag=c/10;
		}
	  else
		{
		   arr[i]=c;
		   flag=0;	
		}
	}
}
int main()
{
	int i=N,j,a[M],b[M],c[M];
	for(i=0;i<M;i++)   //初始化数组,使标记值都是-1  
    {  
        a[i]=0;     //存储全部 乘积以及个位乘积  
        b[i]=0;     //存储十位乘积  
        c[i]=0;  
    }
	a[0]=0;a[1]=0;a[2]=0;a[3]=1;
	b[0]=0;b[1]=0;b[2]=0;b[3]=1;
	c[0]=0;c[1]=0;c[2]=0;c[3]=1;
	int x,y,z,flag=0;
	for(i=999;i>0;i--)
	{
		if(i<100)
		{
			x=i%10;
			y=i/10;
			cheng(b,x);
			cheng(a,y);
			move(a);
			sum(a,b);
				for(j=0;j<M;j++)
	        { b[j]=a[j];}
		}
		else
		{
			x=i%10;
			z=i/100;
			y=(i-z*100)/10;
			cheng(b,y);
			move(a);			
			sum(a,b);
			cheng(c,z);
			hmove(c);
			sum(c,a);
				for(j=0;j<M;j++)
	         {
	         b[j]=c[j];
	         a[j]=c[j];
	     }
			
		}
		
        
			 
	}
	for(i=0;i<M;i++)         //循环数出2的个数  
        {if(a[i]==2)  
            flag++;
			} 
	 printf("有%d个2",flag);
	
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐