Решил реализовать данный алгоритм на 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%
Связанные записи
Распечатать запись
Пример на 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));
}
}