10

スターター向けの定義: 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 を見つけます。

  1. flip(n) が定義され、flip(n) = n
  2. flip(n*n) が定義されています
  3. 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;
}
4

3 に答える 3

4

ヒューリスティックに (確かに最小限の実験を行い、主に直感に頼って)、数学的に検索手法を最適化せずに解を見つける可能性はあまりありません(たとえば、3,4 を含まない完全な正方形を構築するための構築方法を採用するなど)。計算を最適化するのとは対照的に、これは複雑さを目立った量だけ変更しません):

まず、10^11 未満の 2 つの基準 (数値と反転が同じであること、反転可能に対称であること、および 2011 の倍数であること) を満たすすべての数値のリストから始めます。

192555261 611000119 862956298 988659886 2091001602 2220550222 2589226852 6510550159 8585115858 10282828201 12102220121 18065559081 18551215581 19299066261 20866099802 22582528522 25288188252 25510001552 25862529852 28018181082 28568189582 28806090882 50669869905 51905850615 52218581225 55666299955 58609860985 59226192265 60912021609 68651515989 68828282889 69018081069 69568089569 85065859058 85551515558 89285158268 91081118016 92529862526 92852225826 95189068156 95625052956 96056895096 96592826596 98661119986 98882128886 98986298686

そこには 46 個の数字があり、定義と 2011 の倍数 (10^11 未満) に従って、すべて反転可能に対称です。この条件を満たす 2011 年の倍数は、統計的には桁数が増えるにつれて回文数が少なくなるため、少なくなります。

つまり、任意の範囲、たとえば [1, 10^11] (上記のように) の場合、46 個あります。幅が等しい隣接する範囲: [10^11+1, 2*10^11] の場合、次のように推測できます。別の 46 かそこら。しかし、10 のより高い累乗で同じ幅の区間を続けていくと、数字の数は同じになります (等幅の区間を分析するため) が、桁数が増加するため、回文条件はより多くの桁に当てはまります。したがって、無限に近づくと、任意の間隔で固定された回文の数が 0 に近づくことが期待されます。または、より形式的には (ただし証明はありません)、すべての正の値 N について、確率 0 で、与えられた間隔 (所定の幅) は N 倍以上になります。回文である2011年の。

そのため、徹底的な検索が続くにつれて、見つけることができる回文の数は減少します。回文が見つかった場合、正方形が反転可能である確率に従って、回文の正方形が一様に分布していると仮定します (そうでないことを示す分析がなく、そうでないと信じる理由がないため)。反転可能な d 桁の長さは (7/10)^d です。

見つけた最小の正方形から始めましょう

192555261 ^ 2 = 37077528538778121

これはすでに 17 桁の長さであり、約 0.002 (約 1/430) の確率で反転可能に定義されます。しかし、リストの最後に到達するまでには、次のようになります。

98986298686 ^ 2 = 9798287327554005326596

これは 24 桁の長さで、反転可能に定義される確率は 1/5000 未満です。

したがって、より多くの数で検索を続けると、回文の数が減少し、見つかった回文の四角形が反転可能である可能性も減少します。これは両刃の刃です。

残っているのは、ある種の密度比を見つけ、それに応じて解を見つける可能性がどれほど低いかを確認することです... 確率論的に言えば、解を見つける可能性がはるかに低くなることは直感的に明らかですが (これは決して、1 つまたは大きな数の解が存在します (おそらく無限数?))。

幸運を!誰かがこれを解決してくれることを願っています。多くの問題と同様に、解決策は多くの場合、より高速なマシンでアルゴリズムを実行したり、より多くの並列処理を行ったり、長時間実行したりするなどの単純なものではありませんが、より高度な手法や問題に対処するためのより独創的な方法を使用します。自分自身がフィールドをさらに進めます。答えである数値は、それを導出するために使用される方法よりも (通常は) あまり重要ではありません。

于 2011-04-25T17:53:33.950 に答える
2

2011 年までに割り切れる数をすべて検索し、それらがひっくり返るかどうかを確認します。しかし、7 桁の数に達した後は、2011 年までに割り切れるという条件よりも、それ自体が反転するという条件の方が制限的です。数字の 3、4、7 は、それ自体の反転が前置された数を構成し、真ん中の数字が 11、22、55、または 88 の場合、真ん中の数字を押しつぶす可能性があります。次に、2011 年までに割り切れるかどうかをテストします。n*nフリップ可能です。

n*n整数オーバーフローが発生する可能性があることに十分注意してください。基数が 5 桁にnなると、9 桁または 10 桁にn*nなり、18 ~ 21 桁になります。

于 2011-04-25T17:06:07.507 に答える
-1

必ずしも完全な解決策ではなく、途中で役立つ可能性のある思考プロセスのようなものです。

  1. n = flip(n) => n は回文 (flip() で 180° 回転) であり、n は、flip() で自分自身にマップされる数字のみで構成されます。つまり、0、1、2、5、8 です。
  2. flip(n*n) が定義されています。したがって、n*n に 3、4、7 を含めることはできません
  3. n % 2011 = 0.
  4. n > 0。
于 2011-04-25T16:43:23.977 に答える