Lập trình để tính giá trị của một số viết dưới dạng la mã.
Biết: M = 1000; D = 500; C= 100; L = 50; X = 10; V = 5; I = 1 VD: MDCLXVI = 1666CODE THAM KHẢO:
PROGRAM ROMAN_DECIMA_CONVERT;
uses crt;
VAR
RomanNumber :String; {Dùng để test}
{--------------------------------------------------------------------------}
{Đổi toàn bộ chữ thường ra chữ hoa}
function Upper (Text :String) :String;
var
i :Integer;
begin
for i := 1 to Length (Text) do Text [i] := UpCase (Text [i]);
Upper := Text;
end; {Upper}
{--------------------------------------------------------------------------}
{Mô tả:
function Roman2Dec (Roman :String) :Integer;
- Hàm đổi chữ số La mã sang hệ thập phân.
- Vào: Roman : Chữ số La mã (String);
- Ra : Chữ số ở hệ thập phân (Integer).
- Chữ số La mã:
I = 1
V = 5
X = 10
L = 50
C = 100
D = 500
M = 1000
- Xác định giá trị:
+ Xác định từ chữ số nào lớn nhất, sau đến chữ số nhỏ hơn:
( M ->D ->C ->L ->X ->V ->I )
+ Giống nhau thì nhân đôi, nhân ba ...
+ Khác nhau thì: Chữ số nhỏ hơn:
~Đứng ở bên trái làm giảm giá trị của chữ số lớn hơn ở bên phải
~Đứng ở bên phải làm tăng giá trị của chữ số lớn hơn ở bên trái
+ VD: MMXIV = 2014
.Lớn nhất MM = 1000*2=2000
.Lớn tiếp theo: X=10
.Lớn tiếp theo: V=5
.Lớn tiếp theo: I=1
.I bên trái V: 5-1=4;
.IV bên phải X: 10+4=14
.XIV bên phải MM: 2000+14=2014
}
function Roman2Dec (Roman :String) :Integer;
const
RomanChar = 'IVXLCDM'; {Bảng ký tự chữ số La mã: 7 ký tự}
{Và giá trị tương ứng trong chữ số thập phân:}
RomanValue :Array [1..7] of Integer = (1, 5, 10, 50, 100, 500, 1000);
var
i :Byte; {Xử lý trên từng ký tự số La mã}
sum :Integer; {Biến tạm, chứa giá trị thập phân}
begin
sum := 0; {Chú ý: Phải khởi tạo giá trị trước cho biến=0, nếu không kết quả sai}
Roman := Upper (Roman); {Ra chữ Hoa}
i := Length (Roman);
while (i >= 1) do
begin
if (i > 1) then
begin
if (Pos (Roman [i], RomanChar) <= (Pos (Roman [i-1], RomanChar))) then
begin
sum := sum + RomanValue [Pos (Roman [i+0], RomanChar)];
Dec (i);
end
else
begin
sum := sum + RomanValue [Pos (Roman [i+0], RomanChar)];
sum := sum - RomanValue [Pos (Roman [i-1], RomanChar)];
Dec (i, 2);
end;
end
else
begin
sum := sum + RomanValue [Pos (Roman [1], RomanChar)];
Dec (i);
end;
end; {while}
Roman2Dec := sum; {Kết quả}
end; {Roman2Dec}
{----------------------------Chương trình chính----------------------------}
BEGIN
clrscr;
Write ('Nhap vao so La ma: ');
ReadLn (RomanNumber); {cần kiểm tra có phải là số La mã}
WriteLn ('So La ma ', RomanNumber,' la: ', Roman2Dec (RomanNumber));
ReadLn;
END.
Đăng nhận xét