Математическая задача - PullRequest
0 голосов
/ 06 апреля 2009

Вот проблема:

Один лист содержит 10 этикеток. Я хочу напечатать много этикеток, но с произвольного начального индекса. Теперь я хочу узнать, сколько листов потребуется для печати этикеток, которые желает пользователь. Например, допустим, я взял начальный индекс 52 и хочу напечатать 23 этикетки. Тогда как мне найти необходимое количество листов? У кого-нибудь есть формула для подсчета этого?

edit Здравствуйте, ребята, спасибо за ответы, проблема решена. большое спасибо всем.

Ответы [ 9 ]

5 голосов
/ 06 апреля 2009

Полагаю, вы имеете в виду, что у вас есть предопределенный макет страницы, т. Е. Если вы хотите напечатать этикетки с 42 по 67, вы должны напечатать страницы с этикетками 40-49, 50-59 и 60-69. *

Все, что вам нужно сделать, это найти индекс листа начальной страницы и индекс листа конечной страницы, вычесть их и сложить 1. Индекс листа метки n равен полу (n / 10) (или просто n / 10 с целочисленным делением). Итак, если ваша начальная этикетка n и вы хотите напечатать x этикеток, то количество листов, которое вам нужно:

floor((n+x)/10) - floor(n/10) + 1

Это все предполагает нулевые индексы для здравомыслия (это означает, что первая метка имеет индекс 0). Если ваши номера меток основаны на единицах, т. Е. Первая метка имеет индекс 1, то сначала нужно вычесть один из n , поэтому формула будет иметь вид:

floor((n-1+x)/10) - floor((n-1)/10) + 1

Это должно быть легко понять.

4 голосов
/ 06 апреля 2009

Требуемое количество страниц (с использованием целочисленной арифметики):

(items + pageSize - 1) / pageSize

где items - количество этикеток для печати, а pageSize - количество этикеток на странице.

Начальный индекс не имеет значения для количества страниц, если вы знаете, сколько этикеток вы собираетесь напечатать. Если вы печатаете 25 этикеток, не имеет значения, является ли начальный индекс 4 или 827364827364, это все еще 25 этикеток.


Edit:

Если вы хотите использовать индекс, чтобы при желании оставить метки пустыми на первой странице, то есть вывести 19 меток из индекса 14 в индекс 32:

Page 1: -- -- -- 14 15 16 17 18 19 20
Page 2: 21 22 23 24 25 26 27 28 29 30
Page 3: 31 32 -- -- -- -- -- -- -- --

Затем вы сначала вычисляете, сколько меток оставить пустыми перед первой меткой:

(index - 1) % pageSize

(где% - оператор модуля (или остатка).)

Затем вы добавляете эти пустые элементы к числу этикеток, чтобы вычислить фактическое количество элементов для печати. Для приведенного выше примера это будет 3 + 19 = 22. Затем оно будет использовано в приведенном выше расчете для получения количества страниц.

4 голосов
/ 06 апреля 2009

например я взял начальный индекс 10 и я хочу напечатать 52 этикетки. я нахожу нужное количество листов

Потолок ((52 - 10 + 1) / 10) -> страницы (Правка: убедитесь, что вы выполняете деление с плавающей запятой вместо целого)

(52 - 10 + 1)% 10 -> количество наклеек на последней странице

4 голосов
/ 06 апреля 2009

Ceil ((52-10) / 10)

пример кода

В Delphi это будет

function AmountOfSheets(startingIndex: Integer; labels: Integer): Integer;
const
  ILabelsPerSheet: Integer = 10;    
begin
  Result := Ceil((labels - startingIndex) / ILabelsPerSheet);
end;

Спасибо всем, кто прокомментировал, как правильно понял, или процитировал jc с небольшой помощью от моих друзей .

1 голос
/ 06 апреля 2009

С такой же интерпретацией, как у Сванте, с индексами, начинающимися с 1, я бы написал ответ как

nSheets = ceiling((startIndex+nLabels) / 10) - ceiling(startIndex / 10) + 1

Для данного примера с 52 метками, начиная с индекса 10, у нас есть метки, пронумерованные до индекса 61 (= 10 + 52-1):

                           10 (end of first sheet -> 1 label)
11 12 13 14 15 16 17 18 19 20 (second sheet -> 11 labels)
21 22 23 24 25 26 27 28 29 30 (third sheet -> 21 labels)
31 32 33 34 35 36 37 38 39 40 (fourth sheet -> 31 labels)
41 42 43 44 45 46 47 48 49 50 (fifth sheet -> 41 labels)
51 52 53 54 55 56 57 58 59 60 (sixth sheet -> 51 labels)
61                            (beginning of seventh sheet -> 52 labels)

так что нужны 7 листы, и мы можем проверить

ceiling((10+52)/10)-ceiling(10/10)+1 = ceiling(6.2)-ceiling(1)+1 = 7-1+1 = 7
1 голос
/ 06 апреля 2009

Я предполагаю из вашего очень сложного для понимания вопроса, что ваш «начальный индекс» - это позиция на странице, где будет напечатана первая этикетка. Примерно так:

1     2
3     4
5     6
7     8
9     10

Итак, количество печатаемых вами страниц - это общее количество этикеток, которое вы хотите, за вычетом количества этикеток, напечатанных на первой странице, деленное на количество этикеток на странице:

int labels_per_page = 10;
int starting_index = 10;
int total_labels = 52;
// Edit to account for a starting_index of more than labels_per_page:
int first_page = labels_per_page - ((starting_index - 1) % labels_per_page);
// first_page has one label
int remaining_labels =  total_labels - first_page;
if (remaining_labels <= 0) { return 1; }
// 51 labels left
int total_pages = ceiling(remaining_labels / labels_per_page) + 1;
// 7 pages total
return total_pages;

Вам нужно убедиться, что first_page больше total_labels, поскольку может быть только одна страница.

1 голос
/ 06 апреля 2009

Предполагается, что вы намерены повторно использовать половину использованных листов этикеток, у вас есть что-то вроде

labelsOnFirstPage = labelsPerPage + 1 - StartIndex
if( totalLabels > labelsOnFirstPage )
{
    return 1 + Ceiling( (totalLabels - labelsOnFirstPage) / labelsPerPage )
}
else
{
    return 1;
}
1 голос
/ 06 апреля 2009

Требуемое количество листов всегда будет суммой, которую вы хотите сделать, деленное на 10, округленное в большую сторону. Если начальный индекс отнимается от итоговой суммы, которая будет напечатана, итоговые метки будут отрицательными, а начальный индекс делится на 10, округляется в большую сторону.

ceil (Всего этикеток / 10)

ceil ((Всего этикеток - индекс) / 10)

Пример PHP:

$starting_index=0;
$total=52 - $starting_index;
$labels_per_page=10;
$pages=ceil($total / $labels_per_page);
0 голосов
/ 06 апреля 2009

⌈ (52-10 + 1) / 10⌉

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...