Было указано, что последнее d
цифры полного квадрата может только взять определенные значения. Последнее d
цифры (в основе b
) номера n
совпадают с остатком, когда n
разделен на b
<глоток> d
глоток>, т.е. в нотации n % pow(b, d)
.
C Это может быть обобщено к любому модулю m
, т.е. n % m
может использоваться для исключения некоторого процента чисел от того, чтобы быть полными квадратами. Модуль, который Вы в настоящее время используете, равняется 64, который позволяет 12, т.е. 19% остатков, как возможные квадраты. С небольшим кодированием я нашел модуль 110880, который позволяет только 2016, т.е. 1,8% остатков как возможные квадраты. Таким образом в зависимости от стоимости операции модуля (т.е. подразделение) и поиск по таблице по сравнению с квадратным корнем на Вашей машине, с помощью этого модуля могло бы быть быстрее.
Между прочим, если Java имеет способ сохранить упакованный массив битов для таблицы поиска, не используйте его. 110 880 32-разрядных слов не являются большим количеством RAM в эти дни, и выборка машинного слова будет быстрее, чем выборка единственного бита.
Хорошо, я возьму удар. Стандарт C ++, раздел 24.1 / 5:
Итераторы также могут иметь особые значения, не связанные с любой контейнер. [Пример: после объявление неинициализированного указатель x (как с int * x;), x должен всегда предполагается иметь единственное число значение указателя. ] Результаты большинства выражения не определены для единственного числа ценности; единственное исключение - это присвоение неособого значения итератор, содержащий особую значение.
Итак, нет, их нельзя сравнивать.
Спецификация говорит, что постусловие конструктора по умолчанию состоит в том, что итератор сингулярный . Сравнение на равенство не определено, поэтому оно может отличаться в некоторых реализациях.
Я считаю, что вам следует передать функции диапазон .
void fun(std::list<int>::iterator beg, std::list<int>::iterator end)
{
while(beg != end)
{
// do what you want here.
beg++;
}
}