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 }
原文地址:https://www.cnblogs.com/icedream61/p/4458008.html