Поиск по разделу «Программирование»

Число прописью

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 —  пятьдесят четыре тысячи триста двадцать один .