スターター向けの定義: flip(n) は 7 セグメント ディスプレイ フォント番号の 180 度回転であるため、7 セグメント フォントの 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) は未定義であるべきだと確信していますが、宿題では Flip(168) = 891 と書かれているので、この割り当てに関しては Flip(1) が定義されています)
元の課題:次の 3 つの条件を保持する整数 n > 0 を見つけます。
- flip(n) が定義され、flip(n) = n
- flip(n*n) が定義されています
- n は 2011 年までに割り切れる -> n % 2011 == 0
以下で見つけることができる解決策はうまくいくようですが、少なくとも2011年については答えが見つかりません。代わりに1991年を使用している場合(問題を解決できる「ベース」番号を検索しました)取得しています1515151 がその 1 つであると言うかなり速い答え。したがって、基本的な概念は機能しているように見えますが、宿題の特定の「ベース」では機能していません。ここで何か不足していますか?
疑似コードで書かれたソリューション (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;
}