话不多说,上代码,自己看。
#include<cstdio>
#include<iostream>
using namespace std;
void add(int num1[200],int num2[200])
{
int i,M=199;
for(i=0;i<M;i++)
{
num1[i]+=num2[i];
if(num1[i]>9)
{
num1[i]-=10;
num1[i+1]++;
}
}
for(i=M;i>=0 ;--i)
{
if(num1[i]!=0)
{
for(;i>=0;--i)
printf("%d",num1[i]);
}
else continue;
}
printf("\n");
}
int main()
{
int carry,n,j,m,digit,digit1,temp,i; //carry进位 digit,digit1是位数
int a[200],b[200];
while(scanf("%d%d",&n,&m)!=EOF)
{
fill(a,a+200,0);
fill(b,b+200,0);
a[0]=1,b[0] = 1;
digit=1,digit1=1;
for(i=2; i<=n; i++)
{
for(carry=0,j=1; j<=digit; ++j)
{
temp=a[j-1]*i+carry;//相应阶乘中的一项与当前所得临时结果的某
//位相乘(加上进位)
a[j-1]=temp%10; //更新临时结果的位上信息
carry=temp/10; //看是否有进位
}
while(carry)
{
a[++digit-1]=carry%10; //新加一位,添加信息。位数增1
carry/=10; //看还能不能进位
}
}
for(i=2; i<=m; i++)
{
for(carry=0,j=1; j<=digit1; ++j)
{
temp=b[j-1]*i+carry;//相应阶乘中的一项与当前所得临时结果的某
//位相乘(加上进位)
b[j-1]=temp%10; //更新临时结果的位上信息
carry=temp/10; //看是否有进位
}
while(carry)
{
b[++digit1-1]=carry%10; //新加一位,添加信息。位数增1
carry/=10; //看还能不能进位
}
}
add(a,b);
}
return 0;
}