Это может быть проще, если вы думаете с точки зрения глав.
Скажем, каждый набор страниц является главой, главы нумеруются с 0, 1, 2, ...
Тогда в первой главе есть страницы в диапазоне
Q r + 1 <= страница <= Q </em> (r + 1)
Теперь рассмотрим слово (page / Q). Это r, если страница не кратна Q, в противном случае это r + 1.
При заданном значении r вы можете найти страницы главы как Lower = Q r + 1 и выше = min (max, Q (r + 1)).
Так что вы можете сделать это.
if (Z < 1 || Z > max_page) { error;}
if (Z % Q == 0) {
r = Z/Q - 1; // integer division, gives floor.
}
else {
r = Z/Q; // floor.
}
Begin = Q*r + 1;
End = Min (Q*(r+1), max_page);
Чтобы избавиться от if, теперь вы можете заменить его на
if (Z < 1 || Z > max_page) { error;}
r = (Z-1)/Q;
Begin = Q*r + 1;
End = Min (Q*(r+1), max_page);
Это работает, потому что:
Q r + 1 <= Z <= Q </em> (r + 1) тогда и только тогда, когда
Q r <= Z-1 <= Q </em> r + (Q-1).
При этом этаж ((Z-1) / Q) = г.