求整数n> 0表示以下三个条件

时间:2011-04-25 16:28:56

标签: java smallbasic

启动器的一些定义: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)应该是未定义的,但是功课说翻转(168)= 891所以关于这个分配,翻转(1)被定义了)

原始挑战:查找整数n> 0,它包含以下三个条件:

  1. flip(n)被定义并且flip(n)= n
  2. flip(n * n)已定义
  3. n可被2011整除 - > n%2011 == 0
  4. 我们在下面找到的解决方案似乎有效,但至少在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;
    }
    

3 个答案:

答案 0 :(得分:4)

启发式(实际上只有极少的实验并且主要依靠直觉),如果没有优化搜索技术,你就不太可能找到解决方案数学(例如采用一种构造方法来构建一个完美的不包含3,4,7的正方形,并且是对称的。优化计算相反,而不会将复杂性改变为显着的数量):

我将首先列出满足2个标准的所有数字的列表(数字和它的翻转是相同的,即可轻松对称,并且它是2011年的倍数),小于10 ^ 11:

  

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 :(得分:2)

您正在搜索2011年可以整除的所有数字,然后检查它们是否是自己的翻转。但是在你达到7位数之后,它本身就是一个翻转的条件比2011年可以整除的条件更具限制性。所以我建议你反而遍历所有可以构造的数字。数字3,4,7然后构造自身翻转的数字,如果中间数字是11,22,55或88,可能会压缩中间数字。然后测试2011年的可分性,然后测试是否n*n是可以翻转的。

非常非常清楚n*n可能会遇到整数溢出。当您达到基数的5位数字时,n的长度为9或10位,n*n的长度为18-21位。

答案 2 :(得分:-1)

不一定是一个完整的解决方案,更像是可以帮助你的思维过程。

  1. n = flip(n)=&gt; n是回文(翻转()中的180°旋转),n仅包含在翻转中映射到自身的数字(),即:0,1,2,5,8
  2. flip(n * n)被定义。因此,n * n可以不包含3,4,7
  3. n%2011 = 0。
  4. n&gt; 0