Перевод чисел из арабской системы счисления в римскую, с помощью рекурсии. - C#
Формулировка задачи:
Здравствуйте помогите, пожалуйста, написать программу, переводящую числа из арабской системы счисления в римскую, с помощью рекурсивного алгоритма. При этом числа пользователь вводит с клавиатуры. Данная программа должна использовать 2 массива:
int[] masD = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
string[] masR = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
заранее спасибо
вот нашла похожий вариант программы на Pascal. Осталось только перевести на c sharp
{ Copyright MM Andrew Usachov }
Const
R: Array[1..13] of String[2] =
('I','IV','V','IX','X','XL','L','XC','C','CD','D','CM','M');
A: Array[1..13] of Integer=
(1,4,5,9,10,40,50,90,100,400,500,900,1000);
Function Roman(N : Integer) : String;
Var Result : String;
i : Integer;
begin
Result := '';
i := 13;
While N >0 do
begin
While A[i] >N do Dec(i);
Result := Result + R[i];
Dec(N, A[i]);
end;
Roman := Result;
end;
Function Arabic(S : String) : Integer;
Var Result : Integer;
i, p : Integer;
begin
Arabic := -1;
Result := 0;
i := 13;
p := 1;
While p <=Length(S) do
begin
While Copy(S, p, Length(R[i])) <>R[i] do
begin
Dec(i);
If i = 0 then Exit;
end;
Result := Result + A[i];
p := p + Length(R[i]);
end;
If Roman(Result) = S then Arabic := Result
end;
Var N, Err : Integer;
S : String;
BEGIN
repeat
ReadLn(S);
If S = '' then Break;
Val(S, N, Err);
If Err = 0 then
WriteLn(Roman(N))
else
WriteLn(Arabic(S));
until false;
END.Решение задачи: «Перевод чисел из арабской системы счисления в римскую, с помощью рекурсии.»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication56
{
class Program
{
static string[] R = { "I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M" };
static int[] A = { 1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000 };
public static string Roman(int N)
{
string result = "";
int i;
i = 12;
while (N > 0)
{
while (A[i] > N)
i--;
result += R[i];
N -= A[i];
}
return result;
}
public static int Arabic(string S)
{
int result = 0, i = 12, p = 0;
while (p < S.Length)
{
while (S.Substring(p, R[i].Length) != R[i])
{
i--;
if (i == -1)
return -1;
}
result += A[i];
p += R[i].Length;
}
if (Roman(result) == S)
return result;
return 0;
}
static void Main(string[] args)
{
Console.WriteLine(Roman(21));
Console.WriteLine(Arabic("XX"));
Console.ReadKey(true);
}
}
}