Pas.0021. Напишите программу, которая выводит заданное натуральное $0 < N < 999'999'999'999$ прописью, например, \( N = 1'234'567'890 \) — «Один миллиард двести тридцать четыре миллиона пятьсот шестьдесят семь тысяч восемьсот девяносто».
Решение.program NumberInWords;
const
t = 1000;
DIGITAL_N = 54321;
SECOND_TERNARY = 2;
FROM_10_TO_19 = 1;
var
n : longint = DIGITAL_N;
ternaryCounter : integer;
ternaryString, nString : string;
ternaryNames : array [1..4] of string =
('', 'тысяч', 'миллион', 'миллиард');
ternarySuffixes : array [1..4,0..9] of string =
(('', '', '', '', '', '', '', '', '', ''),
('', 'а', 'и', 'и', 'и', '', '', '', '', ''),
('ов', '', 'а', ' а', 'а', 'ов', 'ов', 'ов', 'ов', 'ов'),
('ов', '', 'а', ' а', 'а', 'ов', 'ов', 'ов', 'ов', 'ов'));
female : array[0..9] of string =
('', 'одна', 'две', 'три', 'четыре', 'пять',
'шесть', 'семь', 'восемь', 'девять');
male : array[0..9] of string =
('', 'один', 'два', 'три', 'четыре', 'пять',
'шесть', 'семь', 'восемь', 'девять');
teens : array[0..9] of string =
('десять', 'одиннадцать', 'двенадцать', 'тринадцать',
'четырнадцать', 'пятнадцать', 'шестнадцать',
'семнадцать', 'восемнадцать', 'девятнадцать');
tens : array[0..9] of string =
('', '', 'двадцать', 'тридцать', 'сорок', 'пятьдесят',
'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто');
hundreds : array[0..9] of string =
('', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот',
'шестьсот', 'семьсот', 'восемьсот', 'девятьсот');
function GetTernaryString(ternary, tCounter : integer) : string;
var
digitValue, tenValue, hundredValue : integer;
begin
digitValue := ternary mod 10;
tenValue := (ternary div 10) mod 10;
hundredValue := ternary div 100;
if ternary = 0 then
GetTernaryString := ''
else if tenValue = FROM_10_TO_19 then
GetTernaryString := hundreds[hundredValue] + ' ' +
teens[digitValue] + ' ' +
ternaryNames[tCounter] +
ternarySuffixes[tCounter, 0]
else if tCounter = SECOND_TERNARY then
GetTernaryString := hundreds[hundredValue] + ' ' +
tens[tenValue] + ' ' + female[digitValue] + ' ' +
ternaryNames[tCounter] +
ternarySuffixes[tCounter, digitValue]
else
GetTernaryString := hundreds[hundredValue] + ' ' +
tens[tenValue] + ' ' + male[digitValue] + ' ' +
ternaryNames[tCounter] +
ternarySuffixes[tCounter, digitValue];
end;
begin
nString := '';
ternaryCounter := 1;
while n > 0 do
begin
ternaryString := GetTernaryString(n mod t, ternaryCounter);
nString := ternaryString + ' ' + nString;
ternaryCounter := ternaryCounter + 1;
n := n div t;
end;
write(DIGITAL_N + ' — ' + nString + '.');
end.
Консоль.54321 — пятьдесят четыре тысячи триста двадцать один .