求 1~n 的所有罗马数字表达中,出现过的每个字母的个数。
分别对每个数的罗马表达式计算每个字母个数。
对于十进制的每一位,都是一样的规则,只是代表的字母不同。
于是我们从最后一位往前考虑,当前位由字母 s[i] 代表 1,字母 s[i+1] 代表 5,s[i+2] 代表 10(在下一次代表1)。
每一位考虑完 i+=2;
num[i] 为当前位为i对应的 s[i] 的个数,当前位为 4~8 时,s[i+1] 出现 1 次,当前位为 9 时,s[i+2] 出现一次。
http://train.usaco.org/usacoprob2?a=Ubydl1YBuc9&S=preface
/* TASK: preface LANG: C++ */ #include<cstdio> int n; char s[10]="IVXLCDM"; int num[15]={0,1,2,3,1,0,1,2,3,1,0}; int ans[10]; void get(int n){ int i=0; while(n){ int t=n%10; n/=10; ans[i]+=num[t]; if(t>=4&&t<9)ans[i+1]++; if(t==9)ans[i+2]++; i+=2; } } int main(){ freopen("preface.in","r",stdin); freopen("preface.out","w",stdout); scanf("%d",&n); // get(n); for(int i=1;i<=n;i++) get(i); for(int i=0;s[i];i++)if(ans[i]) printf("%c %d\n",s[i],ans[i]); }
┆凉┆暖┆降┆等┆幸┆我┆我┆里┆将┆ ┆可┆有┆谦┆戮┆那┆ ┆大┆始┆ ┆然┆
┆薄┆一┆临┆你┆的┆还┆没┆ ┆来┆ ┆是┆来┆逊┆没┆些┆ ┆雁┆终┆ ┆而┆
┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆没┆ ┆你┆
┆ ┆这┆ ┆试┆方┆在┆逃┆ ┆会┆ ┆在┆ ┆清┆来┆准┆ ┆没┆有┆ ┆没┆
┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆这┆ ┆晨┆ ┆的┆ ┆有┆来┆ ┆有┆
┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆这┆ ┆里┆ ┆没┆ ┆杀┆ ┆来┆ ┆ ┆来┆