给出两个数字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。
一种基本方法是:
但是这对于大范围说[1,1000000]来说是低效的。
有没有有效的方法来实现这一目标?
答案 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"
}
}