奇妙的思路,为什么这么说呢?因为通常我们是怎么考虑大数的呢?转化成字符串进行操作,但事实上这样考虑很复杂的并且很长......
代码越短越迷人啊,于是我就在考虑为什么不能简单一些呢?
于是有了以下思路:
1.开一个int型数组,num[i]储存的是结果的第i位,然后操作起来特别方便。
然后.......超时......
于是看了人家的思路,改了一下,思路如下:
开一个long long int型数组,num[i]储存的是结果的(i-1)*7到i*7-1位,为什么要开成long long呢?因为int会超限啊,一个七位数乘以1000的话......
代码如下:(可能有点乱)
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAX 10000000
using namespace std;
int main(){
int n;
scanf("%d",&n);
long long int ans[100000];
memset(ans,0,sizeof(ans));
ans[1]=1;
int k=1;
for(int i=1;i<=n;i++){
int j=1;
while(j<=k){
ans[j]*=i;
if(ans[j-1]>MAX-1){
ans[j]+=ans[j-1]/MAX;//原因是如果进位在相乘之前的话会出现一个bug,就是进制的那一部分数也会被乘以i
ans[j-1]%=MAX;
}
j++;
}
j--;
while(ans[j]>MAX-1){
ans[j+1]+=ans[j]/MAX;
ans[j]%=MAX;
j++;
}
if(ans[j]==0)j--;
k=j;
}
int K=k;
printf("%lld",ans[K]);
K--;
while(K>0)printf("%.7lld",ans[K--]);
printf("\n");
}