Проверить високосный год - без использования операции деления - PullRequest
0 голосов
/ 04 сентября 2018

Как проверить, является ли данный год високосным, без использования операции деления или какой-то библиотечный метод на Java. Можно ли проверить это с помощью побитового оператора?

PS: валидация не нужна веками

Ответы [ 5 ]

0 голосов
/ 30 октября 2018
Year.isLeap(someYear)

Вы должны быть более конкретными с вашими требованиями, это сайт для программистов:)

0 голосов
/ 04 сентября 2018
  • Если год является столетним годом, то есть делится на 100 , то он должен делиться на 400 , чтобы называться високосным годом .

  • Если год не является столетним, то его нужно делить на 4 , чтобы называть его високосным.

Ниже в коде используется двоичный поиск для проверки, делится ли число на другое число или нет (поскольку / не разрешено, я не уверен, что вы могли бы использовать %, хотя).

    public static boolean isLeapYear(int year){
        return isDivisible(1,year,100,year) ? isDivisible(1,year,400,year) : isDivisible(1,year,4,year);
    }

    private static boolean isDivisible(int low,int high,int divisor,int dividend){
        int mid = 0;
        while(low <= high){
            mid = low + ((high - low) >> 1);
            int result = divisor * mid;
            if(result == dividend) return true;
            else if(result > dividend) high = mid - 1;
            else low = mid + 1;
        }

        return false;
    }
0 голосов
/ 04 сентября 2018

Ну конечно. Поскольку деление или мод степенями 2 (в данном случае 4), это просто проверка.

boolean isLeapYear( int year ) {
    return (( year & 3 ) == 0 );  // if the bottom two bits are 0, then the int is divisible by 4
}

Обратите внимание, что это не идеально, поскольку некоторые века не являются високосными, но, похоже, это не имеет отношения к вашему вопросу (как вы сейчас заявляете).

0 голосов
/ 04 сентября 2018

Да, вы можете сделать это без использования арифметических операций. Используйте карту, которая отображает год от логического значения - будь то високосный год или нет.

0 голосов
/ 04 сентября 2018

Вот несколько способов определения високосных лет без использования функции по модулю.

Во-первых, давайте предположим (или проверим), что год находится в диапазоне 1901 - 2099.

  • Високосный год, выраженный в виде двоичного числа, будет иметь 00 в качестве последние две цифры. Итак:

    это високосный год if year & (not 4) == 0

  • Если у вас есть функция для усечения действительного числа до целое число, то это работает:

    x = trunc(year / 4)

    это високосный год if x * 4 == year

  • Если у вас есть операторы сдвига (не кругового сдвига), в этом я уверен Верилог имеет:

    x = year >> 2

    это високосный год if (x << 2) == year

Если предположение о том, что диапазон равен 1901 - 2099, является ложным, тогда вам потребуется дополнительная логика для устранения 1900, 1800, 1700 and 2100, 2200, 2300 and so on.

...