当前位置: 首页 > 知识库问答 >
问题:

找到所有4位吸血鬼号码

裘嘉树
2023-03-14

我正在解决一个问题,找出所有的4位吸血鬼数字。

吸血鬼数v=x*y被定义为一个具有'n'个偶数位数的数字,通过将一对'n/2'位数的数字(其中的数字以任意顺序取自原始数)x和y相乘而形成。如果v是吸血鬼的数字,那么X&Y和被称为它的“尖牙”。

吸血鬼数量的例子有:

    1.    1260=21*60
    2.    1395=15*93
    3.    1530=30*51

我曾经尝试过蛮力算法,将给定数字的不同数字组合在一起,并将它们相乘。但这种方法效率很低,而且占用大量时间。

这个问题有没有更高效的算法解决方案?

共有1个答案

艾奕
2023-03-14

或者你可以使用本页描述的吸血鬼号码的一个属性(链接自维基百科):

皮特·哈特利发现的一个重要理论结果:

      If x·y is a vampire number then x·y == x+y (mod 9) 

证明:设mod是二进制模运算符,d(x)是x的十进制数的和。众所周知,d(x)mod9=xmod9,对于所有x。假设X·Y是吸血鬼。那么它包含与x和y相同的数字,特别是d(x·y)=d(x)+d(y)。这导致:(x·y)mod 9=d(x·y)mod 9=(d(x)+d(y))mod 9=(d(x)mod 9+d(y)mod 9)mod 9=(x mod 9+y mod 9)mod 9=(x+y)mod 9

在{(0,0),(2,2),(3,6),(5,8),(6,3),(8,5)}

因此您的代码可能如下所示:

for(int i=18; i<100; i=i+9){          // 18 is the first multiple of 9 greater than 10
   for(int j=i; j<100; j=j+9){        // Start at i because as @sh1 said it's useless to check both x*y and y*x
       checkVampire(i,j);
   }
}

for(int i=11; i<100; i=i+9){          // 11 is the first number greater than 10 which is = 2 mod 9
   for(int j=i; j<100; j=j+9){
       checkVampire(i,j);
   }
}

for(int i=12; i<100; i=i+9){
   for(int j=i+3; j<100; j=j+9){
       checkVampire(i,j);
   }
}

for(int i=14; i<100; i=i+9){
   for(int j=i+3; j<100; j=j+9){
       checkVampire(i,j);
   }
}

// We don't do the last 2 loops, again for symmetry reasons

由于它们是每个集合中的40个元素,如{(x mod 9,y mod 9)=(0,0);10<=x<=y<=100},所以当一个蛮力给你10 4个迭代时,你只会做4*40=160迭代。如果考虑>=1000约束,则可以执行更少的操作,例如,可以避免检查是否j<1000/i

现在你可以很容易地按比例放大,找到4位数以上的吸血鬼=)

 类似资料:
  • 本文向大家介绍4位吸血鬼数字的java实现思路与实例讲解,包括了4位吸血鬼数字的java实现思路与实例讲解的使用技巧和注意事项,需要的朋友参考一下 这个问题来源于Java编程思想一书,所谓“吸血鬼数字”就是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数字,其中从偶数位数字中选取的数字可以任意排列。例如: 1260=21*60,1827=21*87,2187=27*81

  • 我正在编写一个生成吸血鬼号码的程序https://en.wikipedia.org/wiki/Vampire_number。 我有一个带有numberOfDigits参数的主函数,它必须是偶数。如果numberOfDigits等于4,那么我们在1000到9999范围内搜索吸血鬼号码--四位数。如果numberOfDigits等于6,那么我们搜索的是100000到999999之间的吸血鬼号码--这是

  • 本文向大家介绍查找信号到达字符串中所有位置所花费的时间-C ++,包括了查找信号到达字符串中所有位置所花费的时间-C ++的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将编写一个程序来计算信号到达字符串中所有位置所花费的时间。让我用一个例子来解释它。 我们将有一个仅包含s和p字符的字符串。s是信号,p是字符串中的位置。信号从s开始,沿左右两个方向传播。我们假设要花费一个单位时间才能到达

  • 我最近升级到了Webpack4。页面正在成功加载,无论何时发生更改,它都会使用webpack dev server自动刷新页面。它做得很好,但在控制台中显示以下错误 GEThttp://localhost:8090/build/bundle.js404(未找到) 有些时候,当URL中有id时,它会将id附加到捆绑js url中,如下所示 http://localhost:8090/16/build

  • 问题内容: 对于一个我正在从事的项目。我需要在文件系统上寻找可执行文件。对于UNIX派生类,我假定用户将文件包含在强大的$ PATH变量中,但是Windows上没有这样的东西。 我可以放心地假设该文件在文件系统中的深度最多为2个级别,但是我不知道它将是什么驱动器。我必须尝试所有驱动器,但无法弄清楚如何列出所有可用的驱动器(已为其分配了字母)。 有什么帮助吗? 编辑: 我知道有%PATH%变量,但是

  • 问题内容: 我有一堂课,看起来像下面这样: 我的hibernate映射文件按如下所示映射属性: 我收到以下错误: 看来hibernate不喜欢我的大写字母。我该如何解决? 问题答案: 应该管用…