处理出1-99的,之后的加上多少hundred和and即可。整百和一千的时候注意一下。
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<iostream> using namespace std; typedef long long LL; const double pi=acos(-1.0),eps=1e-8; void File() { freopen("D:\\in.txt","r",stdin); freopen("D:\\out.txt","w",stdout); } template <class T> inline void read(T &x) { char c = getchar(); x = 0;while(!isdigit(c)) c = getchar(); while(isdigit(c)) { x = x * 10 + c - ‘0‘; c = getchar(); } } int a[2000]; int b[15]; int main() { b[1]=3; b[2]=3; b[3]=5; b[4]=4; b[5]=4; b[6]=3; b[7]=5; b[8]=5; b[9]=4; for(int i=1;i<=9;i++) a[i]=b[i]; a[10]=3; a[11]=6; a[12]=6; a[13]=8; a[14]=8; a[15]=7; a[16]=7; a[17]=9; a[18]=8; a[19]=8; a[20]=6; for(int i=21;i<=29;i++) a[i]=a[20]+b[i-20]; a[30]=6; for(int i=31;i<=39;i++) a[i]=a[30]+b[i-30]; a[40]=5; for(int i=41;i<=49;i++) a[i]=a[40]+b[i-40]; a[50]=5; for(int i=51;i<=59;i++) a[i]=a[50]+b[i-50]; a[60]=5; for(int i=61;i<=69;i++) a[i]=a[60]+b[i-60]; a[70]=7; for(int i=71;i<=79;i++) a[i]=a[70]+b[i-70]; a[80]=6; for(int i=81;i<=89;i++) a[i]=a[80]+b[i-80]; a[90]=6; for(int i=91;i<=99;i++) a[i]=a[90]+b[i-90]; int p; for(int i=100;i<=999;i++) { if(i%100==0) p=i, a[i]=b[i/100]+7; else a[i]=a[p]+3+a[i-p]; } a[1000]=11; for(int i=2;i<=1000;i++) a[i]=a[i]+a[i-1]; int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); printf("%d\n",a[n]); } return 0; }
时间: 2024-11-05 21:51:32