romeinse-cijfers
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
// Van getal naar romeins cijfer.
function int2roman ($num, $array = array(1000 => 'M', 900 => 'CM', 500 => 'D', 400 => 'CD', 100 => 'C', 90 => 'XC', 50 => 'L', 40 => 'XL', 10 => 'X', 9 => 'IX', 5 => 'V', 4 => 'IV', 1 => 'I')) {
$char = '';
if (is_int($num) && $num > 0) { // Als $num geen getal is, dan werkt het script niet en returnt hij $char, die leeg is.
foreach ($array as $key => $char) {
if ($num >= $key) {
break; // num is groter/gelijk aan de waarde van deze letter ($char). Breek uit!
}
unset($array[$key]); // De array word kleiner, omdat deze recursief doorgegeven word -> De foreach hoeft dus minder rijen af -> sneller.
}
$char .= int2roman(($num-$key), $array); // $char is al gedefinieerd, bij de uitgebroken foreach. Omdat romeinse cijfers vaak combinaties van letters zijn, moeten we recursief alles opnieuw doen.
}
return $char;
}
// Van romeins cijfer naar getal. (bovenstaande commentaar geld ook voor deze functie, alleen dan omgedraaid)
function roman2int ($rom, $array = array(1000 => 'M', 900 => 'CM', 500 => 'D', 400 => 'CD', 100 => 'C', 90 => 'XC', 50 => 'L', 40 => 'XL', 10 => 'X', 9 => 'IX', 5 => 'V', 4 => 'IV', 1 => 'I')) {
$num = '';
if (preg_match('#^(M|D|C|L|X|V|I)+$#', $rom) && strlen($rom) > 0) {
foreach ($array as $num => $char) {
if (preg_match('#^'.$char.'#', $rom)) {
$rom = preg_replace('#^'.$char.'#', '', $rom, 1);
break;
}
unset($array[$num]);
}
$num += roman2int($rom, $array);
}
return $num;
}
?>
// Van getal naar romeins cijfer.
function int2roman ($num, $array = array(1000 => 'M', 900 => 'CM', 500 => 'D', 400 => 'CD', 100 => 'C', 90 => 'XC', 50 => 'L', 40 => 'XL', 10 => 'X', 9 => 'IX', 5 => 'V', 4 => 'IV', 1 => 'I')) {
$char = '';
if (is_int($num) && $num > 0) { // Als $num geen getal is, dan werkt het script niet en returnt hij $char, die leeg is.
foreach ($array as $key => $char) {
if ($num >= $key) {
break; // num is groter/gelijk aan de waarde van deze letter ($char). Breek uit!
}
unset($array[$key]); // De array word kleiner, omdat deze recursief doorgegeven word -> De foreach hoeft dus minder rijen af -> sneller.
}
$char .= int2roman(($num-$key), $array); // $char is al gedefinieerd, bij de uitgebroken foreach. Omdat romeinse cijfers vaak combinaties van letters zijn, moeten we recursief alles opnieuw doen.
}
return $char;
}
// Van romeins cijfer naar getal. (bovenstaande commentaar geld ook voor deze functie, alleen dan omgedraaid)
function roman2int ($rom, $array = array(1000 => 'M', 900 => 'CM', 500 => 'D', 400 => 'CD', 100 => 'C', 90 => 'XC', 50 => 'L', 40 => 'XL', 10 => 'X', 9 => 'IX', 5 => 'V', 4 => 'IV', 1 => 'I')) {
$num = '';
if (preg_match('#^(M|D|C|L|X|V|I)+$#', $rom) && strlen($rom) > 0) {
foreach ($array as $num => $char) {
if (preg_match('#^'.$char.'#', $rom)) {
$rom = preg_replace('#^'.$char.'#', '', $rom, 1);
break;
}
unset($array[$num]);
}
$num += roman2int($rom, $array);
}
return $num;
}
?>