查找素数范围内的最大出现位数

时间:2015-09-28 12:34:04

标签: arrays algorithm numbers primes

给出两个数字a和b(1 <= a <= b <= 10 ^ 6)。找出a和b之间所有素数中最常见的数字。如果频率是相同的打印最高位数。

示例:从1到20,素数为 - 2,3,5,7,11,13,17,19。这里2,5,9仅发生一次,3,7发生两次,1发生5倍。结果是1。

一种基本方法是:

  • 在[a,b]范围内 - 找到所有素数。
  • 取一个计数数组来计算从0到9的出现次数。
  • 对于范围内的所有素数,提取所有数字并相应地增加计数数组中数字的计数。
  • 从计数数组中找出最大值。

但是这对于大范围说[1,1000000]来说是低效的。

有没有有效的方法来实现这一目标?

2 个答案:

答案 0 :(得分:4)

执行sieve of Eratosthenes查找0,10 6 范围内的所有素数。这可以非常快速地完成(在适度的机器上不到1秒)。使用10个辅助数组 - 每个数字一个,每个数组的大小为10 6 。如果一个数字不是素数,则0存储所有10个数组。如果数字是素数,则在每个数组中存储给定数字出现在数字中的次数。在每个阵列上循环之后,累积给定数字出现次数prefix sums。这可以在线性时间内非常容易地完成。说数字3:

for (int i = 1; i < n; ++i) {
   a3[i] += a3[i-1];
}

拥有这些数组,您可以在固定时间内计算指定时间间隔内每个数字的出现次数。即,[x,y]区间中出现的次数为a3[y] - a3[x-1](当x为0时,请注意特殊情况)。

该算法的计算复杂度与预计算的Eratosthenes筛网和每个查询的常数相同。内存复杂性是线性的。您可以通过仅存储辅助数组中素数的值来改善内存开销,因此如果需要,它们的大小等于素数的数量,最多为10 6 。然而,这会使实施稍微复杂一些。

答案 1 :(得分:0)

{
  "name": "node-server-ivan",
  "version": "1.0.0",
  "description": "my first node.js server",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.19.0",
    "express": "^4.17.1",
    "mongodb": "^3.6.3",
    "mongoose": "^5.11.15",
    "node": "^15.8.0"
  },
  "devDependencies": {
    "nodemon": "^2.0.7"
  }
}