Напишем программу, которая печатает числа в виде текста. Ограничимся диапазоном от 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() для оставшихся двух цифр.