初学者的一些定义:flip(n) 是七段显示字体编号的 180 度旋转,因此七段字体中的 2 将被翻转为 2。0、1、2、5、8 将映射到自己. 6 -> 9, 9 -> 6 和 3,4,7 未定义。因此,任何包含 3、4、7 的数字都不能翻转。更多示例:翻转(112)= 211,翻转(168)= 891,翻转(3112)=未定义。
(顺便说一句,我很确定翻转(1)应该是未定义的,但是作业说翻转(168)= 891所以关于这个任务翻转(1)是定义的)
最初的挑战:找到一个满足以下三个条件的整数 n > 0:
- 定义了翻转(n)并且翻转(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;
}