Сегодня вспомним, что такое медиана и накодим её нахождение на гошечке. Медиана — это число ровно посередине упорядоченного списка. Весьма полезная штука в статистике; нужна, чтобы получить не среднюю температуру по больнице, а реальное значение 🙂 Например, у нас список 55, 1, 22, 7, 92… чтобы найти медиану:
- упорядочиваем его. Получим: 1, 7, 22, 55, 92
- ищем то, что посередине.. это 22 (кэп одобряэ)
Если у нас четное количество элементов в списке, то медиана — среднее из суммы двух соседних значений. В общем, вот код самого простого варианта:
package main import "fmt" func main() { var median float64 slice := []float64{3, 18, 49, 51, 121, 132} sliceLen := len(slice) center := sliceLen / 2 if sliceLen%2 == 0 { median = (slice[center-1] + slice[center]) / 2 } else { median = slice[center] } fmt.Println(median) }
Упорядочивать список — это отдельная тема для разговора.. есть много разных алгоритмов сортировки (метод пузырька далеко не самый эффективный), потом их покурим в отдельном посте 🙂
А вот еще один вариант программы — где мы уже вводим значения самостоятельно. Эта версия работает только с нечетным числом членов:
package main import ( "bufio" "fmt" "os" "strconv" "strings" ) func getN(r *bufio.Reader, nums int) int { for i := 1; nums > i; i++ { nRaw, err := r.ReadString('\n') if err != nil { panic(err) } n, err := strconv.Atoi(strings.TrimSpace(nRaw)) if err != nil { panic(err) } if i > nums/2 { return n } } return 0 } func main() { r := bufio.NewReader(os.Stdin) fmt.Println("How much numbers for calc?") numsR, err := r.ReadString('\n') if err != nil { panic(err) } nums, err := strconv.Atoi(strings.TrimSpace(numsR)) if err != nil { panic(err) } n := getN(r, nums) fmt.Println(n) }
Домашнее задание: допилите эту версию до того, чтобы она корректно работала не только с нечетными значениями, но и с чётными 😉