前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【USACO 2.2】Preface Numbering (找规律)

【USACO 2.2】Preface Numbering (找规律)

作者头像
饶文津
发布2020-06-02 10:58:51
2730
发布2020-06-02 10:58:51
举报
文章被收录于专栏:饶文津的专栏

求 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

代码语言:javascript
复制
/*
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]);
}    
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-10-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档