Язык Go. Число в слова


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


Запись опубликована в рубрике Go. Добавьте в закладки постоянную ссылку.

Добавить комментарий

🇬🇧 Attention! Comments with URLs/email are not allowed.
🇷🇺 Комментарии со ссылками/email удаляются автоматически.