码迷,mamicode.com
首页 > 其他好文 > 详细

【Preface Numbering】罗马数字

时间:2018-06-08 15:52:48      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:数字   优化   lcd   simple   ati   open   大量   表达   pac   

【Problem description】

  一类书的序言是以罗马数字标页码的。传统罗马数字用单个字母表示特定的数值,一下是标准数字表:

  I 1 L 50 M 1000
  V 5 C 100
  X 10 D 500

  最多3个可以表示为10n的数字(I,X,C,M)可以连续放在一起,表示它们的和:

  III=3
  CCC=300
  可表示为5x10n的字符(V,L,D)从不连续出现。

  除了下一个规则,一般来说,字符以递减的顺序接连出现:

  CCLXVIII = 100+100+50+10+5+1+1+1 = 268
  有时,一个可表示为10^n的数出现在一个比它大的数前(I在V或X前面,X在L或C前面,等等)。在这种情况下,数值等于后面的那个数减去前面的那个数:

  IV = 4
  IX = 9
  XL = 40
  像XD, IC, 和XM这样的表达是非法的,因为前面的数比后面的数小太多。对于XD(490的错误表达),可以写成 CDXC; 对于IC(99的错误表达),可以写成XCIX; 对于XM(990的错误表达),可以写成CMXC。

  给定N(1 <= N < 3,500), 序言的页码数,请统计在第1页到第N也中,有几个I出现,几个V出现,等等 (从小到大的顺序)。不要输出并没有出现过的字符。

  比如N = 5, 那么页码数为: I, II, III, IV, V. 总共有7个I出现,2个V出现。

【Input format】  

一个整数N。

【Output format】

每行一个字符和一个数字k,表示这个字符出现了k次。字符必须按数字表中的递增顺序输出。

【Algorithm design】

 Simple enumeration

【Problem analysis】

优化前:

就是一个理解和顺向模拟的题目

对于1到n的每一个数搞一下就行了

采取的顺序是从整到零

由最左向右逐渐推进即可

 

优化后:

针对大量的重复运算

按位数分三种情况处理即可

【Source code】

#include <bits/stdc++.h>

#define F(i,j,k) for(int i=j;i<=k;i++)

#define D(i,j,k) for(int i=j;i>=k;i--)

 

using namespace std;

 

string let="IVXLCDM";

 

int cnt,cnt_let[7];

 

void input()

{

   cin>>cnt;

   return;

}

 

void work()

{

   F(turn,1,cnt)

   {

      int num=turn;

      int lvl_chk=0;

      while(num)

      {

         int num_chk=num%10;

         if(num_chk<=3)

            cnt_let[lvl_chk]+=num_chk;

         else if(num_chk<=8)

         {

            cnt_let[lvl_chk]+=abs(num_chk-5);

            cnt_let[lvl_chk+1]+=1;

         }

         else

         {

            cnt_let[lvl_chk]+=1;

            cnt_let[lvl_chk+2]+=1;

         }

         lvl_chk+=2;

         num/=10;

      }

   }

   return;

}

 

void output()

{

   F(i,0,6)

      if(cnt_let[i])cout<<let[i]<<" "<<cnt_let[i]<<endl;

   return;

}

 

int main()

{

   freopen("preface.in","r",stdin);

   freopen("preface.out","w",stdout);

   input();

   work();

   output();

   return 0;

}

【Preface Numbering】罗马数字

标签:数字   优化   lcd   simple   ati   open   大量   表达   pac   

原文地址:https://www.cnblogs.com/qswx/p/9155666.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!