欧拉项目 # 51 c++

Project Euler # 51 c++

本文关键字:c++ 项目      更新时间:2023-10-16

我正在尝试解决欧拉项目中的问题 51。

以下是问题陈述:欧拉项目问题 51

我尝试了下面给出的方法。

  1. 使用埃拉托色尼筛生成 2 到 10 次方 8 之间的所有质数
  2. 从筛子中收集所有 n 位数字(即首先我将获得所有 3 位数字,然后是 4 位数字.. 依此类推并计算)
  3. 检查数字是否有重复的数字(根据问题陈述,我们有 2 个相同数字的 *)。如果是,则转换为字符串
  4. 如果是,找到它重复的位置并将其保存为键(例如:12341 将导致 04 作为键,因为 1 是在 0 和第 4 个位置重复的数字)
  5. 现在基于键,插入桶中(桶是一个多映射,其中包含键作为重复位置(04),值作为质数)

  6. 对于存储桶中的每个键,删除重复的位置。如果我采用 04 存储桶键,那么该存储桶中的所有质数都将在位置 0 和 4 重复字符串。我删除字符串的第 0 和第 4 个位置,这将导致我的数字 (12341) 为 234 并将其插入到地图中,该地图会将出现次数存储为(234,8 是修剪后的数字和出现次数)。

  7. 现在,如果键 234
  8. 重复 8 次,找到被修剪并产生 234 的数字。这些就是答案。

我在 c++ 中运行了这个算法,对于 7 个素数 56003、56113、56333、56443、56663、56773 和 56993 的结果不到一秒。

但是,对于 8 位数字,我越过了 10 次幂 8 素数,但仍然没有产生任何答案。我相信答案超出了这个限制。

当我尝试生成 2 到 10 次方 9 之间的素数时,它会中止,因为我将所有数字存储在向量中。

我的问题是,

有没有办法让我们微调上述步骤并找到答案,或者我需要想一些其他方法来找到答案.

注意:仅举个例子,我以 12341 为例。

您的蛮力解决方案中至少存在一个问题。您假设正好有 2 位数字*但问题从未提及这一点。可能有 1 或 3 个或更多数字,当用相同的数字替换时0-9仍然生成素数。

由于

以下原因,不可能有 8 个素数和 1 或 2 个*

  • 如果你只使用 1 * ,假设用 1 替换它以获得素数(我们称之为素数 p)。现在如果p % 3 = 1,你不能用036替换*,否则这个数字会变成复合的(可被3整除)。扔掉 3 个候选人使得不可能产生另一个素数。下一种情况,如果p % 3 = 2,您不能将*替换为258原因相同。对于任何数量的数字,用一个*制作 8 个素数是不可能的。

  • 如果你只使用 2 * ,假设用 1 替换两者以获得素数(我们称之为素数 p)。现在如果p % 3 = 2,你不能用036替换两个*,否则这个数字会变成复合的(可被3整除)。扔掉 3 个候选人使得不可能产生另一个素数。下一种情况,如果p % 3 = 1,出于同样的原因,您不能将*替换为258。对于任何数量的数字,都不可能使具有两个*的 8 素数。

这就是您的代码没有提供所需输出的原因。您也许应该尝试使用 3 个*字符。