какую математику делают я должен преобразовать это число

учитывая X, что математика необходима для нахождения ее Y, с помощью этой таблицы?

x->y
0->1
1->0
2->6
3->5
4->4
5->3
6->2

проблема агностика языка

и не, я/наклоняю, просто хранят массив и делают поиск.

да, вход всегда будет конечным множеством от 0 до 6. это привычка масштабироваться позже.

9
задан Uberfuzzy 3 May 2010 в 20:11
поделиться

11 ответов

Это:

y = (8 - x) % 7

Вот как я пришел к этому:

x  8-x  (8-x)%7
----------------
0   8     1
1   7     0
2   6     6
3   5     5
4   4     4
5   3     3
6   2     2
36
ответ дан 4 December 2019 в 05:50
поделиться
int f(int x)
{
    return x["I@Velcro"] & 7;
}
26
ответ дан 4 December 2019 в 05:50
поделиться

0.048611x^6 - 0.9625x^5 + 7.340278x^4 - 26.6875x^3 + (45 + 1/9)x^2 - 25.85x + 1

Иногда простые способы лучше. ;)

23
ответ дан 4 December 2019 в 05:50
поделиться

Это выглядит так:

y = (x * 6 + 1)% 7

16
ответ дан 4 December 2019 в 05:50
поделиться

Мне не очень нравится оператор %, поскольку он делает деление так:

y = (641921 >> (x*3)) & 7;

Но потом вы сказали, что не используете таблицы поиска, так что, возможно, это вам не подходит :-)

Update: Поскольку вы хотите на самом деле использовать это в реальном коде, а криптографические числа не нравятся, я могу предложить этот более удобный вариант:

y = (0x2345601 >> (x*4)) & 15;
13
ответ дан 4 December 2019 в 05:50
поделиться

Объединение идей в ответе Дейва и Пола дает довольно элегантный результат:

y = (8 - x) % 7`

(хотя я вижу, что это меня избило)

4
ответ дан 4 December 2019 в 05:50
поделиться
unsigned short convertNumber(unsigned short input) {
  if (input <= 1) { return !input; } //convert 0 => 1, 1 => 0
  return (8-input); //convert 2 => 6 ... 6 => 2
}
2
ответ дан 4 December 2019 в 05:50
поделиться

Домашнее задание?

Как насчет:

y = (x <= 1 ? 1 : 8) - x
1
ответ дан 4 December 2019 в 05:50
поделиться

и нет, я не могу просто хранить массив и выполнять поиск.

Почему нет?

Да, на входе всегда будет конечное множество от 0 до 6. Оно не будет масштабироваться позже.

Тогда просто используйте кучу условий.

if (input == 0) return 1;
else if (input == 1) return 0;
else if (input == 2) return 6;
...

Или найдите формулу, если ее легко увидеть, а она здесь есть:

if (input == 0) return 1;
else if (input == 1) return 0;
else return 8 - input;

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

y = (8 - x) % 7

Мы знаем, что x % y = x - floor(x/y)*y

Поэтому мы можем использовать y = 8 - x - floor((8 - x) / 7) * 7

1
ответ дан 4 December 2019 в 05:50
поделиться

Хотя кажется, что уже появилась куча правильных ответов, я решил опубликовать это, чтобы показать другой способ решить эту проблему (они ' все в основном вариации одного и того же):

Что ж, основной шаблон довольно прост:

x y
0 6
1 5
2 4
3 3
4 2 
5 1
6 0

y = 6 - x

Ваши данные просто имеют значения y, смещенные «вниз» на два индекса (или значения x смещены » вверх").

Итак, вам нужна функция для сдвига значения x. Это должно сделать это:

x = (x + 5) % 7;

Результирующее уравнение:

y = 6 - ((x + 5) % 7);
6
ответ дан 4 December 2019 в 05:50
поделиться

А что насчет бит-фу?

Вы можете получить результат, используя только минус, логические операторы и сдвиги.

b = (x >> 2) | ((x >> 1) & 1)
y = ((b << 3)|(b ^ 1)) - x
1
ответ дан 4 December 2019 в 05:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: