Как преобразовать число Rust в английские sh слова, например 1 -> «один»? - PullRequest
0 голосов
/ 05 мая 2020

У меня есть задача преобразовать число в текст (например, 115 -> «сто пятнадцать). Число будет от 0 до 18 446 744 073 709 551 615 (максимальное значение для 64-битного целого числа без знака).

последнее преобразование должно быть 18 446 744 073 709 551 615 -> «восемнадцать квинтиллионов четыреста сорок шесть квадриллионов семьсот сорок четыре триллиона эвенты-три миллиарда семьсот девять миллионов пятьсот пятьдесят одна тысяча шестьсот пятнадцать»

1 Ответ

2 голосов
/ 05 мая 2020

У меня есть эта программа под рукой, так как это обычная проблема на веб-сайтах, посвященных проблемам кодирования. Вам нужно разложить номер на группы по 3 цифры в каждой, а затем вызвать функцию для рекурсивной сериализации номера в текст. Вот полное решение:

use std::iter::successors;

const ONES: [&str; 20] = [
    "zero",
    "one",
    "two",
    "three",
    "four",
    "five",
    "six",
    "seven",
    "eight",
    "nine",
    "ten",
    "eleven",
    "twelve",
    "thirteen",
    "fourteen",
    "fifteen",
    "sixteen",
    "seventeen",
    "eighteen",
    "nineteen",
];
const TENS: [&str; 10] = [
    "zero", "ten", "twenty", "thirty", "forty", "fifty", "sixty",
    "seventy", "eighty", "ninety",
];
const ORDERS: [&str; 7] = [
    "zero",
    "thousand",
    "million",
    "billion",
    "trillion",
    "quadrillion",
    "quintillion", // enough for u64::MAX
];

pub fn encode(num: u64) -> String {
    match num {
        0..=19 => ONES[num as usize].to_string(),
        20..=99 => {
            let upper = (num / 10) as usize;
            match num % 10 {
                0 => TENS[upper].to_string(),
                lower => format!("{}-{}", TENS[upper], encode(lower)),
            }
        }
        100..=999 => format_num(num, 100, "hundred"),
        _ => {
            let (div, order) =
                successors(Some(1u64), |v| v.checked_mul(1000))
                    .zip(ORDERS.iter())
                    .find(|&(e, _)| e > num / 1000)
                    .unwrap();

            format_num(num, div, order)
        }
    }
}

fn format_num(num: u64, div: u64, order: &str) -> String {
    match (num / div, num % div) {
        (upper, 0) => format!("{} {}", encode(upper), order),
        (upper, lower) => {
            format!("{} {} {}", encode(upper), order, encode(lower))
        }
    }
}

ссылка на ржавую площадку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...