zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    记录一次linux centos7被hack的填坑记录-20201015
    linux端口转发:分为本机端口转发和将本机端口转发到其他机器 这2种情况
    proxmox通过spice来连接
    PAT L3-015. 球队“食物链”
    蓝桥杯模拟一 封印之门
    蓝桥杯模拟一 数列求值
    第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 K 密码
    计蒜客 蓝桥杯模拟五 合并数字
    PAT L3-017. 森森快递
    PAT L1-046. 整除光棍
  • 原文地址:https://www.cnblogs.com/icedream61/p/4458008.html
Copyright © 2011-2022 走看看