/*1000!中有几个2*/
#include <iostream>
using namespace std;
#define n 1000
#define m 3000
/*十位相乘后数组向后扩展一位*/
void move(int arry[])
{
int j;
for(j=m;j>=0;j--)
{
arry[j]=arry[j-1];
}
arry[0]=0;
}
void hmove(int arry[])
{
int j;
for(j=m;j>=2;j--)
{
arry[j]=arry[j-2];
}
arry[0]=0;
arry[1]=0;
}
void singel(int arr[],int s) //计算乘法(个位和十位)
{
int stnum=0; //记录乘个位时每次得到的结果大于10的情况
int j;
int temp;
for(j=0;j<m;j++)
{
if(s*arr[j]+stnum<10)
{
arr[j]=s*arr[j]+stnum;
stnum=0; //隔了一个数字时将stnum清空,如3417与3相乘时在1与3相乘处就得清空stnum
}
else if(s*arr[j]+stnum>=10)
{
temp=s*arr[j]+stnum;//当不进行这句的赋值而是直接在表达式中用s*arr[j]+stnum来进行计算时会出现意想不到的结果
arr[j]=temp%10;
stnum=temp/10;
}
}
}
void sum(int a[],int b[]) //计算加法(数组a和b)
{
int j;
int temp;
static int st2=0; //记录乘十位时每次得到的结果大于10的情况
for(j=0;j<m;j++) //在这里用a的个数不用b是因为a的个数一定大于等于b的个数
{
temp=a[j]+b[j]+st2; //当不进行这句的赋值而是直接在表达式中用s*arr[j]+stnum来进行计算时会出现意想不到的结果
if(temp<10)
{
a[j]=temp;
st2=0; //隔了一个数字时将st2清空,如01234与76948相加时在3与4相加处就得清空st2
}
else
{
a[j]=temp%10;
st2=temp/10;
}
}
}
void main()
{ int flg=0,c,d,e; //记录2的个数
int i,j,k;
int a[m],b[m]; //得到十位相乘的结果以及十位和个位数据相乘完毕后的结果
int h[m];
for(k=0;k<m;k++) //初始化数组,使标记值都是-1
{
a[k]=0; //存储全部 乘积以及个位乘积
b[k]=0; //存储十位乘积
h[k]=0;
}
/*使数组a,b值为第一个数的值*/
a[0]=0;a[1]=0;a[2]=0;a[3]=1;
b[0]=0;b[1]=0;b[2]=0;b[3]=1;
h[0]=0;h[1]=0;h[2]=0;h[3]=1;
for(i=n-1;i>=1;i--)
{
if(i<100)
{ c=i%10;//得到个位数
d=i/10;
singel(b,c); //个位数与每个数组数字相乘
singel(a,d); //十位数与每个数组数字相乘
move(a);
/*计算乘十位数和乘个位数后数组的和,放在a数组中*/
sum(a,b);
for(j=0;j<m;j++) //同步a,b数组的数据
{
b[j]=a[j];
}
}
if(i>=100 &&i<=999)
{ c=i%10; //得到个位数
d=i/10-i/100*10;
e=i/100;
singel(b,c); //个位数与每个数组数字相乘
singel(a,d); //十位数与每个数组数字相乘
move(a);
/*计算乘十位数和乘个位数后数组的和,放在a数组中*/
sum(a,b);
singel(h,e); //百位乘积
hmove(h);
sum(h,a);
for(j=0;j<m;j++) //同步a,b数组的数据
{ b[j]=h[j];
a[j]=h[j];
}
}
}
for(j=0;j<m;j++) //循环数出2的个数
if(a[j]==2)
flg++;
cout<<"1000的阶乘中含有2的个数是:"<<flg<<"个\n"; }
1000!(1000的阶乘)中有几个2-----三个数组
最新推荐文章于 2022-04-16 22:13:14 发布