105 lines
2.5 KiB
Rust
105 lines
2.5 KiB
Rust
fn number_to_letters(n: u32) -> String {
|
|
if n == 0 {
|
|
return "zero".to_string();
|
|
}
|
|
|
|
let ones = [
|
|
"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine",
|
|
];
|
|
let teens = [
|
|
"ten",
|
|
"eleven",
|
|
"twelve",
|
|
"thirteen",
|
|
"fourteen",
|
|
"fifteen",
|
|
"sixteen",
|
|
"seventeen",
|
|
"eighteen",
|
|
"nineteen",
|
|
];
|
|
let tens = [
|
|
"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety",
|
|
];
|
|
|
|
let mut result = String::new();
|
|
let mut num = n;
|
|
|
|
// 处理千位
|
|
if num >= 1000 {
|
|
let thousands = num / 1000;
|
|
result.push_str(&number_to_letters_under_1000(
|
|
thousands, &ones, &teens, &tens,
|
|
));
|
|
result.push_str("thousand");
|
|
num %= 1000;
|
|
if num > 0 {
|
|
result.push_str("and");
|
|
}
|
|
}
|
|
|
|
// 处理百位以下
|
|
if num > 0 {
|
|
result.push_str(&number_to_letters_under_1000(num, &ones, &teens, &tens));
|
|
}
|
|
|
|
result
|
|
}
|
|
|
|
fn number_to_letters_under_1000(n: u32, ones: &[&str], teens: &[&str], tens: &[&str]) -> String {
|
|
let mut result = String::new();
|
|
let mut num = n;
|
|
|
|
// 处理百位
|
|
if num >= 100 {
|
|
let hundreds = num / 100;
|
|
result.push_str(ones[hundreds as usize]);
|
|
result.push_str("hundred");
|
|
num %= 100;
|
|
if num > 0 {
|
|
result.push_str("and");
|
|
}
|
|
}
|
|
|
|
// 处理十位和个位
|
|
if num >= 20 {
|
|
let ten_digit = num / 10;
|
|
result.push_str(tens[ten_digit as usize]);
|
|
num %= 10;
|
|
if num > 0 {
|
|
result.push_str(ones[num as usize]);
|
|
}
|
|
} else if num >= 10 {
|
|
result.push_str(teens[(num - 10) as usize]);
|
|
} else if num > 0 {
|
|
result.push_str(ones[num as usize]);
|
|
}
|
|
|
|
result
|
|
}
|
|
|
|
fn count_letters(text: &str) -> usize {
|
|
text.chars().filter(|c| c.is_alphabetic()).count()
|
|
}
|
|
|
|
fn solve_letter_count(start: u32, end: u32) -> usize {
|
|
(start..=end)
|
|
.map(|n| count_letters(&number_to_letters(n)))
|
|
.sum()
|
|
}
|
|
|
|
fn main() {
|
|
// 验证 1-5 的例子
|
|
let test_words = ["one", "two", "three", "four", "five"];
|
|
let test_count: usize = test_words.iter().map(|w| w.len()).sum();
|
|
println!("1到5的字母数: {test_count}");
|
|
|
|
// 验证我们的函数
|
|
let our_count = solve_letter_count(1, 5);
|
|
println!("我们函数计算的1到5: {our_count}");
|
|
|
|
// 计算 1 到 1000
|
|
let result = solve_letter_count(1, 1000);
|
|
println!("1到1000的字母总数: {result}");
|
|
}
|