Некоторое определение для стартеров: flip (n) - это поворот на 180 градусов семисегментного номера шрифта дисплея, поэтому шрифт из 2-х семи сегментов будет перевернут на 2. 0,1,2,5,8 будет сопоставлены с самим собой. 6 → 9, 9 → 6 и 3,4,7 не определены. Поэтому любое число, содержащее 3,4,7, не будет гибким. Дополнительные примеры: flip (112) = 211, flip (168) = 891, flip (3112) = не определено.
(Кстати, я вполне уверен, что flip (1) должен быть undefined, но домашнее задание говорит, что flip (168) = 891, поэтому в отношении этого назначения определяется flip (1))
Оригинальная задача: Найти целое число n > 0, которое содержит следующие три условия:
- Определяется flip (n) и flip (n) = n
- Определяется флип (n * n)
- n делится на 2011 год → n %2011 == 0
Наше решение, которое вы можете найти ниже, похоже, работает, но оно не находит ответа хотя бы не на 2011 год. Если я использую 1991 вместо этого (я искал какой-то "базовый" номер, для которого проблема могла быть решена) Я получаю довольно быстрый ответ, говорящий о 1515151. Таким образом, основная концепция, похоже, работает, но не для данной "базы" в домашнем задании. Я что-то пропустил?
Решение, написанное в псевдокоде (у нас есть реализация в Small Basic, и я сделал многопоточность в Java):
for (i = 1; i < Integer.MaxValue; i++) {
n = i * 2011;
f = flip(n, true);
if (f != null && flip(n*n, false) != null) {
print n + " is the number";
return;
}
}
flip(n, symmetry) {
l = n.length;
l2 = (symmetry) ? ceil(l/2) : l;
f = "";
for (i = 0; i < l2; i++) {
s = n.substr(i,1);
switch(s) {
case 0,1,2,5,8:
r = s; break;
case 6:
r = 9; break;
case 9:
r = 6; break;
default:
r = "";
}
if (r == "") {
print n + " is not flippable";
return -1;
} elseif (symmetry && r != n.substr(l-i-1,1)) {
print n + " is not flip(n)";
return -1;
}
f = r + f;
}
return (symmetry) ? n : f;
}