题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5867
View Code
题意:给一个不超过一千的数字N,求出1-N所有单词加起来的字母个数和(f(1)=len(one)=3,f(2)=f(1)+len(two)=6...)。
分析:一看名字就知道是到水题了...直接打表。(保险起见,我还手打了20内的表)。
代码:
#include<cstdio> #include<cmath> #include<cstring> #include<queue> #include<stack> #include<cstdlib> #include<iomanip> #include<string> #include<vector> #include<map> #include<string> #include<iostream> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f typedef long long ll; #define Max(a,b) (a>b)?a:b #define lowbit(x) x&(-x) int main() { int a[1005]={0}; a[1]=3; a[2]=3; a[3]=5; a[4]=4; a[5]=4; a[6]=3; a[7]=5; a[8]=5; a[9]=4; 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; a[30]=6; a[40]=5; a[50]=5; a[60]=5; a[70]=7; a[80]=6; a[90]=6; a[100]=3+7; for(int i=20;i<100;i+=10) { for(int j=i+1;j<i+10;j++) a[j]=a[i]+a[j-i]; } for(int i=100;i<1000;i+=100) { a[i]=a[i/100]+7; for(int j=i+1;j<=i+99;j++) { a[j]=a[i]+3+a[j-i]; } } a[1000]=3+8; for(int i=2;i<=1000;i++) a[i]+=a[i-1]; int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); printf("%d\n",a[n]); } }
本文解析了一道ACM编程挑战赛题目,通过构建数字到英文单词的映射表来计算1到N所有数字英文表示的总字符数。文章详细介绍了如何手动构造基本数字的字符数,并通过迭代算法计算任意小于1000的数字的英文表示长度。
&spm=1001.2101.3001.5002&articleId=52800285&d=1&t=3&u=f057e89b960745a3b808bcf6642ddf12)
388

被折叠的 条评论
为什么被折叠?



