USACO Section2.2 Preface Numbering 解题报告 【icedream61】
preface解题报告
------------------------------------------------------------------------------------------------------------------------------------------------
【题目】
阿拉伯数字转换为罗马数字的规则如下:
1: I
2: II
3: III
4: IV
5: V
6: VI
7: VII
8: VIII
9: IX
10: X
而我们本题可以用到的罗马数字符号有:
I=1
V=5
X=10
L=50
C=100
D=500
M=1000
如果你还不大明白,那我们举两个例子:
3 7 9 = CCC LXX IX
3 4 9 9 = MMM CD XC IX
如果你仍然不明白,那……你去USACO看原题,或者去网上搜罗马数字表示规则吧...orz
本题给出阿拉伯数N,求出1~N所有阿拉伯数分别转换成罗马数之后,所包含的各种字符的个数。
【数据范围】
1<=N<3500
【输入样例】
5
【输出样例】
I 7
V 2
------------------------------------------------------------------------------------------------------------------------------------------------
【分析】
就像我题目描述中说的思路,把0~9分别一一对应起来便可以很容易转换了。
------------------------------------------------------------------------------------------------------------------------------------------------
【总结】
一遍AC。
顺带复习了下运算符重载。有一点失误是,开始本来打算在main里写num+=convert(i)的,可是重载时写成了加法,于是就把main里改成了num=num+convert(i)。
------------------------------------------------------------------------------------------------------------------------------------------------
【代码】
1 /* 2 ID: icedrea1 3 PROB: preface 4 LANG: C++ 5 */ 6 7 #include <iostream> 8 #include <fstream> 9 using namespace std; 10 11 struct number 12 { 13 int I,V; // 1,5 14 int X,L; // 10,50 15 int C,D; // 100,500 16 int M; // 1000 17 number(int i=0,int v=0,int x=0,int l=0,int c=0,int d=0,int m=0):I(i),V(v),X(x),L(l),C(c),D(d),M(m) {} 18 friend number operator+(number x,number y) 19 { 20 number r; 21 r.I=x.I+y.I; 22 r.V=x.V+y.V; 23 r.X=x.X+y.X; 24 r.L=x.L+y.L; 25 r.C=x.C+y.C; 26 r.D=x.D+y.D; 27 r.M=x.M+y.M; 28 return r; 29 } 30 friend ostream& operator<<(ostream& out,number x) 31 { 32 if(x.I) out<<"I "<<x.I<<endl; 33 if(x.V) out<<"V "<<x.V<<endl; 34 if(x.X) out<<"X "<<x.X<<endl; 35 if(x.L) out<<"L "<<x.L<<endl; 36 if(x.C) out<<"C "<<x.C<<endl; 37 if(x.D) out<<"D "<<x.D<<endl; 38 if(x.M) out<<"M "<<x.M<<endl; 39 return out; 40 } 41 }num; 42 43 int N; 44 45 number convert(int i) // 由于只需要计数,所以实际上并不需要转换全,例如4和6不用加以区分 46 { 47 number r; 48 int m=i/1000; i%=1000; 49 int c=i/100; i%=100; 50 int x=i/10; i%=10; 51 switch(i) 52 { 53 case 0: break; 54 case 1: r.I=1; break; 55 case 2: r.I=2; break; 56 case 3: r.I=3; break; 57 case 4: r.V=1; r.I=1; break; 58 case 5: r.V=1; break; 59 case 6: r.V=1; r.I=1; break; 60 case 7: r.V=1; r.I=2; break; 61 case 8: r.V=1; r.I=3; break; 62 case 9: r.X=1; r.I=1; break; 63 } 64 switch(x) 65 { 66 case 0: break; 67 case 1: r.X+=1; break; 68 case 2: r.X+=2; break; 69 case 3: r.X+=3; break; 70 case 4: r.L+=1; r.X+=1; break; 71 case 5: r.L+=1; break; 72 case 6: r.L+=1; r.X+=1; break; 73 case 7: r.L+=1; r.X+=2; break; 74 case 8: r.L+=1; r.X+=3; break; 75 case 9: r.C+=1; r.X+=1; break; 76 } 77 switch(c) 78 { 79 case 0: break; 80 case 1: r.C+=1; break; 81 case 2: r.C+=2; break; 82 case 3: r.C+=3; break; 83 case 4: r.D+=1; r.C+=1; break; 84 case 5: r.D+=1; break; 85 case 6: r.D+=1; r.C+=1; break; 86 case 7: r.D+=1; r.C+=2; break; 87 case 8: r.D+=1; r.C+=3; break; 88 case 9: r.M+=1; r.C+=1; break; 89 } 90 r.M+=m; 91 return r; 92 } 93 94 int main() 95 { 96 ifstream in("preface.in"); 97 ofstream out("preface.out"); 98 99 in>>N; 100 for(int i=1;i<=N;++i) num=num+convert(i); 101 out<<num; 102 103 in.close(); 104 out.close(); 105 return 0; 106 }
posted on 2015-04-26 17:15 IceDream61 阅读(193) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端