#include<stdio.h>
#include<string.h>
int main (void)
{
int N,sub,sub_a;
int m,i,j,k,p;
int res[500],a[500],b[500];
scanf ("%d",&N);
memset(res,0,sizeof(res));//储存结果
res[499]=1;//将输出结果先赋值为1
while (N) {
memset(a,0,sizeof(a));//a是负责将阶乘中新的数放进去
memset(b,0,sizeof(b));//b是得出a和res得结果
m=N;
i=499;
//将m拆开 放入a数组
while (m) {
a[i]=m%10;
m=m/10;
i--;
}
//sub为res最高位
for (i=0;i<500;i++) {
if (res[i]!=0) {
sub=i;
break;
}
}
//sub_a为a得最高位
for (i=0;i<500;i++) {
if (a[i]!=0) {
sub_a=i;
break;
}
}
p=499;
k=499;
//将a与res的乘积放入b
for (i=499;i>=sub_a;i--) {
for (j=499;j>=sub;j--) {
b[k--]+=(a[i]*res[j])%10;
b[k]+=(a[i]*res[j])/10;
}
p--;
k=p;
}
//b覆盖res
for (i=0;i<500;i++) {
res[i]=b[i];
}
N--;
}
//找到最后的res最高位
for (i=0;i<500;i++) {
if (res[i]!=0) {
sub=i;
break;
}
}
//输出
for (i=sub;i<500;i++) {
printf ("%d",res[i]);
}
}
我将数组开到500,把所有位放0,将每个数拆分从右至做依次放入(还是按原顺序0)
关键代码为如何计算二者成绩,就是将两个多位数相乘按照竖式去计算,但计算时并不是满十进一,而是只取最低位个位放在位置上,其他高位全部进位到上一位,这样可以在两层循环时就搞定。
比如说我们计算111*11
正常竖式为:
11
* 111
------------
11
11
11
------------
1221
我们的计算方法为:
11
* 111
------------
1221
emmm,反正就是直接得111只保留个位1,下一个算出来是111加上前面进位得11就是1221。
————我是太阳骑士索拉尔,愿太阳在你心中闪耀