n数值较小,可以直接与每位上的数相乘。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void reverse(char * s)
{
char temp;
int i,j;
for(i=0,j=strlen(s)-1;i<j;i++,j--)
{
temp=s[i];
s[i]=s[j];
s[j]=temp;
}
}
int main()
{
int n;
char res[3000];
int i,j;
int add;
int len;
while(~scanf("%d",&n))
{
add=0;
len=1;
memset(res,'0',3000);
res[0]='1';
for(i=2;i<=n;i++)
{
for(j=0;j<len;j++)
{
add += (res[j]-'0')*i;
res[j] = add%10 + '0';
add /= 10;
}
for(;add!=0;add/=10)
res[len++]=add%10+'0';
}
res[len]='\0';
reverse(res);
printf("%s\n",res);
}
return 0;
}
用大数乘法实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void reverse(char * s)
{
char temp;
int i,j;
for(i=0,j=strlen(s)-1;i<j;i++,j--)
{
temp=s[i];
s[i]=s[j];
s[j]=temp;
}
}
void multi(char *lef,char * rig,char * res)
{
int ll,rl;
int i,j;
int add,mul;
ll = strlen(lef);
rl = strlen(rig);
int len;
int temp1,temp2;
for(i = 0 ; i < rl ; i ++)
{
add=mul=0;
for(j=0;j<ll;j++)
{
temp1 = (lef[j]-'0')*(rig[i]-'0') + mul;
mul = temp1/10;
temp1 %= 10;
if(res[i+j]==0)
{
temp2= temp1+add;
}
else
{
temp2 = res[i+j] - '0' + temp1 + add;
}
add = temp2 / 10;
res[i+j] = temp2%10 + 48;
}
len = i + ll;
for( ; add != 0 || mul!=0 ; add /= 10,mul /= 10)
{
res[len++] = '0' + mul%10 + add%10;
}
}
}
int main()
{
int n;
char res[3000];
char right[5];
char left[3000];
int i,j;
int add;
int len;
while(~scanf("%d",&n))
{
add=0;
memset(left,0,3000);
memset(res,0,3000);
left[0]='1';
for(i=2;i<=n;i++)
{
/*for(j=0;j<len;j++)
{
add += (res[j]-'0')*i;
res[j] = add%10 + '0';
add /= 10;
}
for(;add!=0;add/=10)
res[len++]=add%10+'0';*/
memset(res,0,3000);
sprintf(right,"%d",i);
reverse(right);
multi(left,right,res);
strcpy(left,res);
}
reverse(res);
printf("%s\n",res);
}
return 0;
}
简单的大数乘法实现
void multiply(const char *a,const char *b)
{
int i,j,ca,cb,*s;
ca=strlen(a);
cb=strlen(b);
s=(int *)malloc(sizeof(int)*(ca+cb)); //分配存储空间
for (i=0;i<ca+cb;i++) s[i]=0; // 每个元素赋初值0
for (i=0;i<ca;i++)
for (j=0;j<cb;j++)
s[i+j+1]+=(a[i]-'0')*(b[j]-'0');
for (i=ca+cb-1;i>=0;i--) // 这里实现进位操作
if (s[i]>=10)
{
s[i-1]+=s[i]/10;
s[i]%=10;
}
char *c=(char *)malloc((ca+cb)*sizeof(char)); //分配字符数组空间,因为它比int数组省!
i=0;while(s[i]==0) i++; // 跳过头部0元素
for (j=0;i<ca+cb;i++,j++) c[j]=s[i]+'0';
c[j]='\0';
for (i=0;i<ca+cb;i++) cout<<c[i];
cout<<endl;
free(s);
}