Перевод из римской системы счисления в десятичную

Программа переводит введёную строку представляющу собой число в римской системе счисления, в десятичную. Сначала она разделяет римское число по десятичным разрядам, а затем находит десятичные цифры соотвествующие этим разрядам.

code: #perl
  1. #!/usr/bin/perl
  2.  
  3. use warnings;
  4.  
  5. sub parseRomanHelper($$)
  6. {
  7.     my $fragment=shift;
  8.     return 0 unless $fragment;
  9.     my $d=shift;
  10.  
  11.     if($d==1)
  12.     {
  13.         $fragment=~tr/XLC/IVX/;
  14.     }
  15.     elsif($d==2)
  16.     {
  17.         $fragment=~tr/CDM/IVX/;
  18.     }
  19.     elsif($d==3)
  20.     {
  21.         $fragment=~tr/M/I/;
  22.     }
  23.  
  24.     $d=10**$d;
  25.     return $d*length($fragment) if $fragment=~m/^I{1,3}$/;
  26.     return $d*4 if $fragment eq 'IV';
  27.     return $d*(4+length($fragment)) if $fragment=~m/^VI{0,3}$/;
  28.     return $d*9;
  29. }
  30.  
  31. sub parseRoman($)
  32. {
  33.     if(shift=~m/^(M{0,3})(D?C{0,3}|C[DM])(L?X{0,3}|X[LC])(V?I{0,3}|I[VX])$/)
  34.     {
  35.         return parseRomanHelper($1, 3)
  36.             +parseRomanHelper($2, 2)
  37.             +parseRomanHelper($3, 1)
  38.             +parseRomanHelper($4, 0);
  39.     }
  40.     return;
  41. }
  42.  
  43. ##################################################
  44.  
  45. die "$0: Требуется римское число\n"
  46.     unless defined(my $roman=shift);
  47. die "$0: Неправильное римское число: «$roman»\n"
  48.     unless defined(my $decimal=parseRoman($roman));
  49.  
  50. print "$decimal\n";
Поделиться:

Похожие статьи: