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 }

 

你可能感兴趣的:(number)