POJ - 1423 - Big Number
https://cn.vjudge.net/problem/POJ-1423
考虑到低位的影响应该几乎没有,用long double暴力存就可以了。
预处理一波直接输出。
//#include <bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const int MAXM=1e5,MAXN=1e7;
long double val[MAXM+1];
int p10[MAXM+1];
void init(){
val[0]=1.0;
long double cur=1.0;
int cntp10=0;
for(int i=1;i<=MAXN;++i){
cur*=i;
if(i%100==0){
val[i/100]=cur;
p10[i/100]=cntp10;
}
if(cur>=1e7){
cur/=1e7;
cntp10+=7;
}
}
}
int calc(int n){
int rc=n%100;
int r=n/100*100+1;
long double cur=1.0;
int cntp10=0;
for(int i=1;i<=rc;++i){
cur*=r;
++r;
if(cur>=1e7){
cur/=1e7;
cntp10+=7;
}
}
cur*=val[n/100];
cntp10+=p10[n/100];
while(cur>=1.0){
cur/=10.0;
cntp10++;
}
return cntp10;
}
int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif // Yinku
init();
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
printf("%d\n",calc(n));
}
return 0;
}