Блог mev'a

все, что я хотел сказать

Решил реализовать данный алгоритм на php, т.к. часто римские цифры нужны во всяких веб-отчетах.

Выполнено в виде класса,хотя можно реализовать и в виде одной функции.

Под катом код и примеры.


Файл class.dec2roman.php

<?php
class dec2roman
{
private $elements=array( array( 'I',1), array('IV',4), array('V',5), array('IX', 9), array( 'X',10), array('XL',40), array('L',50), array('XC',90), array('C',100), array('CD',400), array( 'D',500), array('CM',900), array( 'M',1000) );
private $inNumber; // здесь хранится введенное число
private $outNumber;// здесь хранится результат
function __construct($in){ // конструктор: сохраняем введенное значение, вычисляем результат
$this->inNumber=(int)$in;
if((int)$in>0&&(int)$in<4000):
$this->outNumber=$this->parse($this->inNumber);
else:
$this->outNumber='error';
endif;
}
public function get_result(){ return $this->outNumber;} // получить результат
public function get_input(){ return $this->inNumber;} //получить введенное значение

private function parse( $decimal){// функция перевода из дес в римскую
$scratch = '';
for ($i=12; $i>=0;$i--){
while ( $decimal >= $this->elements[$i][1] ):
$decimal = $decimal - $this->elements[$i][1];
$scratch = $scratch . $this->elements[$i][0];
endwhile;
}
return $scratch;
}
}
?>

Пример использования:

<?php
require_once('./class.dec2roman.php');
$d=new dec2roman(46);
echo $d->get_input().' - '.$d->get_result();
?>

Результат работы скрипта: 46 - XLVI

Файл класс и примера

По просьбам трудящихся выкладываю еще и реализацию на дельфях.

function DecToRoman( Decimal: LongInt ): String;
const
Romans: Array[1..13] of String =
( 'I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C', 'CD', 'D', 'CM', 'M' );

Arabics: Array[1..13] of Integer =
( 1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000);

var
i: Integer;
scratch: String;
begin
scratch := '';
for i := 13 downto 1 do
while ( Decimal >= Arabics[i] ) do
begin
Decimal := Decimal - Arabics[i];
scratch := scratch + Romans[i];
end;
Result := scratch;
end;

Популярность: 1%

Связанные записи

Распечатать запись  Распечатать запись
Получить PDF
Добавить в Facebook Добавить в Twitter Добавить в Google-Buzz Добавить в Яндекс-закладки Добавить в Вконтакте


Один комментарий

  1. Stalker пишет 7 апреля 2008 9:25 P

    Пример на Java:
    public class Dec2Rome {

    private static class RomanValue {
    int intVal;
    String romVal;
    RomanValue(int dec, String rom) {
    this.intVal = dec;
    this.romVal = rom;
    }
    }

    final static RomanValue[] ROMAN_VALUE_TABLE = {
    new RomanValue(1000, «M»),
    new RomanValue(900, «CM»),
    new RomanValue(500, «D»),
    new RomanValue(400, «CD»),
    new RomanValue(100, «C»),
    new RomanValue(90, «XC»),
    new RomanValue(50, «L»),
    new RomanValue(40, «XL»),
    new RomanValue(10, «X»),
    new RomanValue(9, «IX»),
    new RomanValue(5, «V»),
    new RomanValue(4, «IV»),
    new RomanValue(1, «I»)
    };

    public Dec2Rome() {
    }

    public String convert(int dec) {

    if (dec >= 4000 || dec = equiv.intVal) {
    dec -= equiv.intVal;
    result.append(equiv.romVal);
    }
    }

    return result.toString();
    }

    }
    =====================================

    Вызов:
    public class Main {
    public static void main (String ars[])
    {
    Dec2Rome d2r = new Dec2Rome();
    System.out.print(»Result:» + d2r.convert(46));
    }
    }

Оставить комментарий или два