Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6085
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как округлить результат целочисленного деления?
Я думаю, в частности, о том, как отображать элементы управления разбиением на страницы, когда используется такой язык, как C# или Java.
Если у меня есть x элементов, которые я хочу отобразить в кусках y на странице, сколько страниц потребуется?
Нашли элегантное решение:
int pageCount = (records + recordsPerPage - 1) / recordsPerPage;
Источник: Преобразование Чисел, Roland Backhouse, 2001
Преобразование в плавающую точку и обратно кажется огромной тратой времени на уровне CPU.
Решение Иэн Нельсон :
int pageCount = (records + recordsPerPage - 1) / recordsPerPage;
Можно упростить до:
int pageCount = (records - 1) / recordsPerPage + 1;
AFAICS, это не имеет ошибки переполнения, на которую указал Брэндон DuRette, и поскольку он использует ее только один раз, вам не нужно хранить recordsPerPage специально, если он приходит из дорогой функции, чтобы получить значение из файла конфигурации или что-то еще.
I.e. это может быть неэффективно, если config.fetch_value использует поиск по базе данных или что-то еще:
int pageCount = (records + config.fetch_value('records per page') - 1) / config.fetch_value('records per page');
Это создает переменную, которая вам на самом деле не нужна, которая, вероятно, имеет (незначительные) последствия для памяти и просто слишком много печатает:
int recordsPerPage = config.fetch_value('records per page')
int pageCount = (records + recordsPerPage - 1) / recordsPerPage;
Это все одна строка, и только один раз извлекает данные:
int pageCount = (records - 1) / config.fetch_value('records per page') + 1;
Это должно дать вам то, что вы хотите. Вы определенно хотите, чтобы x элементов разделили на y элементов на странице, проблема заключается в том, когда появляются неравномерные числа, так что если есть частичная страница, мы также хотим добавить одну страницу.
int x = number_of_items;
int y = items_per_page;
// with out library
int pages = x/y + (x % y > 0 ? 1 : 0)
// with library
int pages = (int)Math.Ceiling((double)x / (double)y);
Целочисленное математическое решение, которое Ян предоставил, является хорошим, но страдает от ошибки переполнения целого числа. Предполагая, что переменные все int , решение может быть переписано, чтобы использовать long math и избежать ошибки:
int pageCount = (-1L + records + recordsPerPage) / recordsPerPage;
Если records - это long, ошибка остается. Модульное решение не имеет ошибки.
Вариант ответа Ника Берарди , который избегает ветки:
int q = records / recordsPerPage, r = records % recordsPerPage;
int pageCount = q - (-r >> (Integer.SIZE - 1));
Примечание: (-r >> (Integer.SIZE - 1)) состоит из бита знака r, повторенного 32 раза (благодаря расширению знака оператора >> .) Это значение равно 0, если r равно нулю или отрицательно, и -1, если r положительно. Таким образом, вычитание его из q приводит к сложению 1, Если records % recordsPerPage > 0 .
Для записей = = 0 решение rjmunro дает 1. Правильное решение - 0. Тем не менее, если вы знаете, что records > 0 (и я уверен, что мы все предположили recordsPerPage > 0), то решение rjmunro дает правильные результаты и не имеет никаких проблем с переполнением.
int pageCount = 0;
if (records > 0)
{
pageCount = (((records - 1) / recordsPerPage) + 1);
}
// no else required
Все решения целочисленной математики будут более эффективными, чем любые решения с плавающей точкой.
При необходимости расширения метода:
public static int DivideUp(this int dividend, int divisor)
{
return (dividend + (divisor - 1)) / divisor;
}
Никаких проверок здесь (переполнение, DivideByZero и т. д.), Не стесняйтесь добавлять, если хотите. Кстати, для тех, кто беспокоится о накладных расходах на вызов метода, такие простые функции, как эта, могут быть встроены компилятором в любом случае, поэтому я не думаю, что это нужно беспокоиться. Овации.
P.S. возможно, Вам также будет полезно знать об этом (он получает остаток):
int remainder;
int result = Math.DivRem(dividend, divisor, out remainder);
Я делаю следующее, обрабатывает любые переполнения:
var totalPages = totalResults.IsDivisble(recordsperpage) ? totalResults/(recordsperpage) : totalResults/(recordsperpage) + 1;
И используйте это расширение, если есть 0 результатов:
public static bool IsDivisble(this int x, int n)
{
return (x%n) == 0;
}
Кроме того, для текущего номера страницы (не спрашивалось, но может быть полезно):
var currentPage = (int) Math.Ceiling(recordsperpage/(double) recordsperpage) + 1;
Может быть интересен универсальный метод, результат которого можно перебирать итерациями:
public static Object[][] chunk(Object[] src, int chunkSize) {
int overflow = src.length%chunkSize;
int numChunks = (src.length/chunkSize) + (overflow>0?1:0);
Object[][] dest = new Object[numChunks][];
for (int i=0; i<numChunks; i++) {
dest[i] = new Object[ (i<numChunks-1 || overflow==0) ? chunkSize : overflow ];
System.arraycopy(src, i*chunkSize, dest[i], 0, dest[i].length);
}
return dest;
}
У меня была аналогичная потребность, когда мне нужно было преобразовать минуты в часы & минут. Что я был:
int hrs = 0; int mins = 0;
float tm = totalmins;
if ( tm > 60 ) ( hrs = (int) (tm / 60);
mins = (int) (tm - (hrs * 60));
System.out.println("Total time in Hours & Minutes = " + hrs + ":" + mins);
Следующее должно делать округление лучше, чем вышеприведенные решения, но за счет производительности (за счет вычисления с плавающей точкой 0.5*rctDenominator):
uint64_t integerDivide( const uint64_t& rctNumerator, const uint64_t& rctDenominator )
{
// Ensure .5 upwards is rounded up (otherwise integer division just truncates - ie gives no remainder)
return (rctDenominator == 0) ? 0 : (rctNumerator + (int)(0.5*rctDenominator)) / rctDenominator;
}