然后这个题意也蛮简单,就是给你一个不大于1000的数,然后问它的英文表示有多少个字符。如342 (three hundred and forty-two) contains 23 letters and 115 (one hundred and fifteen) contains 20 letters
然后第一反应是打表,都记录下来
其中也是有细节的,所以会WA
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int vis[1005];
void timec()
{
memset(vis,0,sizeof(vis));
vis[1]=3,vis[2]=3,vis[3]=5,vis[4]=4,vis[5]=4,vis[6]=3,vis[7]=5,vis[8]=5,vis[9]=4,vis[10]=3;
vis[11]=6,vis[12]=6,vis[13]=8,vis[14]=8,vis[15]=7,vis[16]=7,vis[17]=9,vis[18]=8,vis[19]=8;
vis[20]=6,vis[30]=6,vis[40]=5,vis[50]=5,vis[60]=5,vis[70]=7,vis[80]=6,vis[90]=6;//不要写 vis[100]=7;
for(int i=21;i<1000;i++)
{
if(vis[i]!=0) continue;//这个要注意
int bw=i/100;
int sw=(i%100)/10;
int gw=i%10;
if(bw>0)
vis[i]=vis[bw]+7;
if(sw>=2)//注意是2.。。因为十几的数你不是都赋值了么。如14是一个整体
vis[i]+=vis[sw*10]+vis[gw];
else vis[i]+=vis[i%100];
if(bw>0&&((gw>0)||(sw>0)))
vis[i]+=3;
}
vis[1000]=11;//1000别忘了
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
long long ans=0;
timec();
for(int i=1;i<=n;i++)
ans+=vis[i];
cout<<ans<<endl;
// cout<<ans<<endl;
}
return 0;
}