Напишем программу, которая печатает числа в виде текста. Ограничимся диапазоном от 1 до 1000.
Вот первый пример кода, кучерявый:
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func n10_19(n int) {
switch n {
case 1:
fmt.Print("elven ")
case 2:
fmt.Print("twelve ")
case 3:
fmt.Print("thirteen ")
case 4:
fmt.Print("fourteen ")
case 5:
fmt.Print("fifteen ")
case 6:
fmt.Print("sixsteen ")
case 7:
fmt.Print("seventeen ")
case 8:
fmt.Print("eighteen ")
case 9:
fmt.Print("nineteen ")
}
}
func n20_90(n int) {
switch n {
case 2:
fmt.Print("twenty ")
case 3:
fmt.Print("thirty ")
case 4:
fmt.Print("fourty ")
case 5:
fmt.Print("fifty ")
case 6:
fmt.Print("sixsty ")
case 7:
fmt.Print("seventy ")
case 8:
fmt.Print("eighty ")
case 9:
fmt.Print("ninety ")
}
}
func n1_9(n int) {
switch n {
case 1:
fmt.Print("one ")
case 2:
fmt.Print("two ")
case 3:
fmt.Print("three ")
case 4:
fmt.Print("four ")
case 5:
fmt.Print("five ")
case 6:
fmt.Print("six ")
case 7:
fmt.Print("seven ")
case 8:
fmt.Print("eight ")
case 9:
fmt.Print("nine ")
case 10:
fmt.Print("thousand ")
}
}
func input(r *bufio.Reader) {
input, err := r.ReadString('\n')
if err != nil {
panic(err)
}
s := strings.TrimSpace(input)
n, _ := strconv.Atoi(s)
if n/100 > 0 {
n1_9(n / 100)
print("hundred ")
n %= 100
}
if n/10 > 0 {
if n/10 == 1 { // 10 - 19
n10_19(n % 10)
} else {
n20_90(n / 10)
n %= 10
if n == 0 {
return
} else {
n1_9(n)
}
}
return
}
if n%10 > 0 {
n1_9(n % 10)
}
}
func main() {
r := bufio.NewReader(os.Stdin)
fmt.Println("Enter number: ")
input(r)
}
Второй вариант кода, более чёткий:
package main
import (
"fmt"
)
func main() {
var num int
fmt.Print("Enter a number between 0 and 1000: ")
fmt.Scan(&num)
if num < 0 || num >= 1000 {
fmt.Println("Invalid input. Please enter a number between 0 and 1000.")
} else {
fmt.Println(numberToWords(num))
}
}
func numberToWords(num int) string {
ones := []string{"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"}
tens := []string{"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"}
if num < 20 {
return ones[num]
} else if num < 100 {
return tens[num/10] + " " + ones[num%10]
} else {
return ones[num/100] + " hundred " + numberToWords(num%100)
}
}
Эта программа использует рекурсивную функцию numberToWords() для преобразования чисел в слова. Функция принимает на вход целое число и возвращает строку, содержащую число в виде слов. Сначала функция проверяет, меньше ли число 20, в этом случае она возвращает соответствующее слово из массива ones. Если число больше или равно 20 и меньше 100, то возвращается соответствующее слово из массива десятков, конкатенированное с соответствующим словом из массива единиц. Если число больше или равно 100, то возвращается соответствующее слово из массива единиц для цифры сотни, скомбинированное с «hundred», и результат вызова NumberToWords() для оставшихся двух цифр.
