像这些大整数加法或者乘法什么的思想都一样,就是截位存取,累积进位,最后逆序输出就可以啦
PS:小生是用10000来存取的,300MS就能A,如果单个存取有点危险,题目时间限制好像是1000ms,大家可以自己试试咯。(核心思想就是进位部分还有最后的边界的控制,逆序输出注意一下题目格式就可以了。 大整数加法的话因为牵扯长度问题所以只能按照字符串来存取并计算,一般这种不超过int的大整数乘除都可以用这种方法的)
AC 代码及详细解释如下:
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 int a[30005]; 6 int main() 7 { 8 int t,n,i,j,k,m,l; 9 while(~scanf("%d",&n)) 10 { 11 memset(a,0,sizeof(a)); 12 a[0]=1; 13 m=0; 14 for(i=2;i<=n;i++) 15 { 16 for(j=0;j<=m;j++)//每一位都相乘前边所有存取的 17 { 18 a[j]*=i; 19 } 20 for(l=1;l<=m;l++)//判断进位 21 { 22 if(a[l-1]>=10000) 23 { 24 a[l]+=a[l-1]/10000; 25 a[l-1]%=10000; 26 } 27 28 29 } 30 while(a[m]>=10000)//判断最后一位是否超过10000 31 { 32 a[m+1]=a[m]/10000; 33 a[m]%=10000; 34 m++; 35 } 36 } 37 for(i=m;i>=0;i--)//逆序输出 38 { 39 if(i==m) 40 printf("%d",a[i]); 41 else 42 printf("%04d",a[i]); 43 } 44 printf("\n"); 45 } 46 return 0; 47 }