Вопрос предоставлен HackerRank
Постановка задачи
Университет HackerLand придерживается следующей политики выставления оценок:
- Каждый учащийся получает оценку в диапазоне от 0 до 100 включительно.
- Любая оценка ниже 40 считается неудовлетворительной.
Сэм — профессор университета, и ему нравится округлять оценку каждого студента в соответствии со следующими правилами:
- Если разница между оценкой и следующим числом, кратным 5, меньше 3, округлить до следующего числа, кратного 5.
- Если значение меньше 38, округления не происходит, так как результат все равно будет неудовлетворительным.
Например, grade =84 будет округлено до 85, а grade = 29 округлено не будет, так как в результате округления получится число меньше .
Зная начальное значение для каждого ученика Сэма, напишите код для автоматизации процесса округления. Для каждого округлите его в соответствии с приведенными выше правилами и выведите результат на новой строке.
Формат ввода
Первая строка содержит единственное целое число, обозначающее (количество учеников).
Каждая строка последующих строк содержит одно целое число, обозначающее оценку учащегося.
Подход
Эта задача представляет собой простой тест на базовые знания в области программирования и понимание требований.
Базовый алгоритм будет выглядеть примерно так:
// 1. Get first input, determine how many students to examine // 2. For each, see whether or not the grade is under 38 // - If it is, return it and proceed to the next grade // - If not, then determine whether or not to round the grade // up
Моя первоначальная мысль заключалась в том, что модуль был бы хорошим подходом здесь. Модуль любого значения больше или равного 38 и 5 ((n >= 38) %5) представляет собой расстояние между классом и следующим кратным 5; если значение равно 3 или 4 , то нам просто нужно добавить 2 или 1 соответственно, чтобы значение достигло следующего кратного 5.
Выполнение
Я продолжу и реализую решение в Go ниже.
package main
import "fmt"
func main() {
// declare variables for the count and list of grades
var count int
var list []int
//read count
_, err := fmt.Scanf("%d\n", &count)
if err != nil {
panic(err)
}
// read input variables
for i := 0; i < count; i++ {
var curr int
_, err := fmt.Scanf("%d\n", &curr)
if err != nil {
panic(err)
}
// if they are passing grades and elligible for round-up
if curr >= 38 && curr%5 >= 3 {
curr = curr + (5 - (curr%5))
}
list = append(list, curr)
}
//print results
for _,n := range list {
fmt.Printf("%d\n", n)
}
}
Вот и все! Создание некоторых переменных для хранения входных данных, чтение из стандартного ввода, применение логики задачи и возврат значений.
Для округления я просто взял разницу в 5 и модуль класса с 5; это дает расстояние до следующего кратного 5. Не слишком сложно.
Увидимся в следующий раз!