Проверьте, больше ли циклическое (по модулю 16) число, чем другое?

У меня есть два циклических целых числа по модулю 16, поэтому они принимают значения от 0 до 15.

Мне нужно сравнить два числа, чтобы определить, n_1 больше, чем n_0

n_1 > n_0

Очевидно, что это не совсем определено, поэтому я определяю n_1 быть больше чем n_0 если впереди меньше 8 "цифр", иначе меньше n_0 (если не равны).

Т.е. если:

n_0 = 0
if n_1 is between 1 and 8 (both inclusive)
then n_1 is greater than n_0.

n_0 = 5
if n_1 is between 6 and 15 (both inclusive)
then n_1 is greater than n_0.

n_0 = 12
if n_1 is between 13 and 15 (both inclusive)
    or between 0 and 4 (both inclusive)
then n_1 is greater than n_0.

Как мне выразить это сравнение программно?

Я уверен, что я путаю приведенную выше терминологию, поэтому, пожалуйста, не стесняйтесь исправлять мою формулировку.:)

4 ответа

Решение

Я думал о часах с 16 часами. Идея в основном состоит в том, чтобы переместить n0 в позицию 0 и переместить n1 на одинаковое количество "тиков". Теперь вы можете просто проверить, больше или меньше n1 в зависимости от того, до 8 или после 8 часов.

public int compare (int n0, int n1){
    int ticksToZero = 16 - n0;
    if(n0 == n1)
        return 0;
    else if((n1 + ticksToZero) % 16 <= 8)
        return -1; //n0 is smaller than n1
    else
        return 1; //n0 is larger than n1
}

Вы можете сделать это без явного добавления 16, используя это выражение:

(b - a) >= (a <= b ? 8 : -8);

Идея состоит в том, что разница должна быть выше 8 или -8 в зависимости от результата сравнения a в b,

Результат применения этой формулы к числам 0..15 включительно выглядит следующим образом (звездочки представляют точки, в которых число от горизонтальной линии меньше, чем число от вертикальной линии; шестнадцатеричные цифры используются для представления чисел выше 9; демонстрация)

  0 1 2 3 4 5 6 7 8 9 A B C D E F
0                 * * * * * * * * 
1 *                 * * * * * * * 
2 * *                 * * * * * * 
3 * * *                 * * * * * 
4 * * * *                 * * * * 
5 * * * * *                 * * * 
6 * * * * * *                 * * 
7 * * * * * * *                 * 
8 * * * * * * * *                 
9   * * * * * * * *               
A     * * * * * * * *             
B       * * * * * * * *           
C         * * * * * * * *         
D           * * * * * * * *       
E             * * * * * * * *     
F               * * * * * * * *   

Вы можете проверить это, найдя разницу n1 а также n0 и проверьте его между 1 и 8.

#include <iostream>
using namespace std;

bool Test(int n0, int n1) {
    int n = (n1 - n0 + 16) % 16;
    return n && n <= 8;
}

int main() {
    cout << Test(0, 0) << endl;
    cout << Test(0, 1) << endl;
    cout << Test(0, 8) << endl;
    cout << Test(0, 9) << endl;
    cout << Test(0, 15) << endl;
    cout << endl;

    cout << Test(5, 0) << endl;
    cout << Test(5, 4) << endl;
    cout << Test(5, 5) << endl;
    cout << Test(5, 6) << endl;
    cout << Test(5, 13) << endl;
    cout << Test(5, 15) << endl;
    cout << endl;

    cout << Test(12, 0) << endl;
    cout << Test(12, 3) << endl;
    cout << Test(12, 4) << endl;
    cout << Test(12, 5) << endl;
    cout << Test(12, 12) << endl;
    cout << Test(12, 15) << endl;

    return 0;
}

Я начал с простой части условия, а затем отразил ее.

    function smaller(n_0, n_1) {
      n = 16;   
      n_0 = n_0 % n;
      n_1 = n_1 % n;
    
      if(n_0 == n_1)
          return 0;
      else
          return (n_0 < n_1 && n_1 <= n_0 + 8) || (n_1 < n_0 &&  n_0 >= n_1 + 8);
    }
    console.log(0);
    console.log(smaller(0,1));
    console.log(smaller(0,8));
    console.log(smaller(0,9));
    console.log(5);
    console.log(smaller(5,6));
    console.log(smaller(5,15));
    console.log(smaller(5,16));
    console.log(12);
    console.log(smaller(12,13));
    console.log(smaller(12,14));
    console.log(smaller(12,15))
    console.log(smaller(12,0));
    console.log(smaller(12,1))
    console.log(smaller(12,2))
    console.log(smaller(12,3))
    console.log(smaller(12,4));
    console.log(smaller(12,5));
    console.log(smaller(12,6));
    console.log(smaller(12,7));
    console.log(smaller(12,8));
    console.log(smaller(12,9));
    console.log(smaller(12,10));
    console.log(smaller(12,11));

Другие вопросы по тегам