Задача. Многоквартирный дом имеет [latex]N[/latex] квартир, [latex]P[/latex] подъездов и [latex]Q[/latex] этажей, причем на каждом этаже каждого подъезда имеется одинаковое количество квартир. Определить в каком подъезде и на каком этаже находится квартира с заданным номером [latex]K[/latex].
Входные данные
В единственной строке файла записаны значения [latex]N[/latex], [latex]P[/latex], [latex]Q[/latex], [latex]K[/latex]. [latex]1[/latex] ≤ [latex]K[/latex] ≤ [latex]N[/latex] ≤ [latex]1000[/latex], [latex]P\cdot Q[/latex] ≤ [latex]N[/latex].
Выходные данные
В единственную строку файла нужно вывести номер подъезда и этаж, на котором находится квартира с номером [latex]K[/latex].
Задача взята с сайта e — olymp.
Тесты
Входные данные | Выходные данные |
250 5 5 1 | 1 1 |
30 2 5 27 | 2 4 |
300 3 10 111 | 2 2 |
80 5 4 77 | 5 4 |
98 7 2 39 | 3 2 |
90 3 15 90 | 3 15 |
Перед нами была поставлена задача определить в доме с заданным количеством квартир, подъездов и этажей положение конкретной квартиры, а именно указать номер подъезда и этаж. Для дальнейшего хода решения определим две целочисленные переменные — flatEntrance (количество квартир в одном подъезде) и flatFloor (количество квартир на одном этаже). Найдем номер подъезда получив целую часть от деления номера квартиры на количество квартир в одном подъезде. Далее выполняем проверку остатка от деления, если он отличен от нуля, то это указывает на то, что квартира находится уже в следующем подъезде. В таком случае инкрементируем переменную entrance.
Для нахождения номера этажа поступим аналогично. Однако следует проверить не делится ли номер квартиры на количество квартир в одном подъезде нацело, если да — она располагается на последнем этаже. Если этого не сделать, то в последующей формуле получим [latex]0[/latex]. В общем случае номер этажа находим поделив остаток от деления номера квартиры на количество квартир в подъезде на количество квартир на этаже (учитываем, что каждый новый подъезд предполагает продолжение нумерации с первого этажа). И снова выполняем проверку остатка от деления. При надобности инкрементируем переменную floor.
Код программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <iostream> using namespace std; int main() { int N, P, Q, K, flatEntrance, flatFloor, entrance, floor; cin >> N >> P >> Q >> K; flatEntrance = N/P; flatFloor = N/P/Q; entrance = K/flatEntrance; if (K%flatEntrance != 0){ entrance++; } if (K%flatEntrance == 0){ floor = Q; } else { floor = (K%flatEntrance)/flatFloor; if (K%flatFloor != 0){ floor++; } } cout << entrance << " " << floor << endl; return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> #include <math.h> using namespace std; int main() { int N, P, Q, K, flatEntrance, flatFloor, entrance, floor; cin >> N >> P >> Q >> K; flatEntrance = N/P; flatFloor = N/P/Q; entrance = ceil(double(K)/flatEntrance); if (K%flatEntrance == 0){ floor = Q; } else { floor = ceil((K%flatEntrance)/double(flatFloor)); } cout << entrance << " " << floor << endl; return 0; } |
Засчитанное решение
Хорошее, грамотное пояснение. Молодец.
Только не нужно так всё усложнять. Задача решается в две формулы: