特殊数字是这样的,即在素数指数上有素数位(2,3,5,7),在非素数指数上有非素数值。(例如,15743-素数索引(2,3,5)具有素数数字(5,7,3))。有多少个n位的特殊数字也可以被m整除。
例如,对于n=2和m=2,答案将是[12,42,62,82,92],所以是5。
我写了一个回溯算法,找到特殊数的所有这些排列,然后检查这些特殊数中的每一个是否可以被m整除,并返回计数。这对n和m的小值有效,但问题的n,m值在0-500范围内。
null
var primes = [2, 3, 5, 7]
var nonPrimes = [1, 4, 6, 8, 9]
n = 2 // number of digits
m = 2 //divisor
k = 0 //remainder
function rec(index, temp, count) {
if (temp.length >= n) {
if (Number(temp) % m === k) {
/* console.log(temp) */
count += 1
}
return count
}
if (primes.includes(index)) {
for (num1 in primes) {
temp += primes[num1];
count = rec(index + 1, temp, count)
temp = temp.slice(0, -1)
}
} else if (nonPrimes.includes(index)) {
for (num2 in nonPrimes) {
temp += nonPrimes[num2];
count = rec(index + 1, temp, count)
temp = temp.slice(0, -1)
}
}
return count
}
console.log("number of n-digit special numbers which are divisible by m with remainder k is ", rec(1, "", 0))
null
由于逐位数的递归可以使它们相互依赖,因此对小于m
的所有余数进行求解,并返回余数0的解。给定“特殊”数字的计数表,这些数字被m
除以时会留下余数r
。然后将索引i+1
的行制表:
(1) Transform the current row of remainders,
each storing a count, multiplying by 10:
for remainder r in row:
new_r = (10 mod m * r) mod m
new_row[new_r] += row[r]
row = new_row
(2) Create new counts by using the new
possible digits:
initialise new_row with zeros
for d in allowed digits for this ith row:
for r in row:
new_r = (r + d) mod m
new_row[new_r] += row[r]
例如,n=2,m=2
:
row = [None, None]
# We are aware of the allowed digits
# at the ith row
row[0] = 3 # digits 4, 6 and 8
row[1] = 2 # digits 1, 9
row = [3, 2]
(1)转换:
new_row = [0, 0]
remainder 0:
new_r = (10 mod 2 * 0) mod 2 = 0
new_row[0] += row[0] = 3
remainder 1:
new_r = (10 mod 2 * 1) mod 2 = 0
new_row[0] += row[1] = 5
row = new_row = [5, 0]
(2)创建新计数:
new_row = [0, 0]
d = 2:
rd = 2 mod 2 = 0
r = 0:
new_r = (0 + 0) mod 2 = 0
new_row[0] += row[0] = 5
r = 1:
new_r = (1 + 0) mod 2 = 1
new_row[1] += row[1] = 0
d = 3: # Similarly for 5, 7
rd = 3 mod 2 = 1
r = 0:
new_r = (0 + 1) mod 2 = 1
new_row[1] += row[0] = 5
r = 1:
new_r = (1 + 1) mod 2 = 0
new_row[0] += row[1] = 5 # unchanged
row = new_row = [5, 15]
[12,42,62,82,92]
[13,15,17,
43,45,47,
63,65,67,
83,85,87,
93,95,97]
我试图学习分布式计算,并遇到了一个寻找大量数字的中位数的问题: 假设我们有一大组数字(假设元素数为 N*K),它们无法放入内存(大小为 N)。我们如何找到这些数据的中位数?假设在内存上执行的操作是独立的,即我们可以考虑有K台机器,每台机器最多可以处理N个元素。 我认为中位数可以用于这个目的。我们可以一次将N个数装入内存。我们在< code>O(logN)时间内找到该集合的中值,并保存它。 然后我们
打印出小于给定数N的素数。对于奖励积分,您的解决方案应该在时间或更好的时间内运行。你可以假设N总是一个正整数。 输入样本: 程序应该接受文件名的路径作为其第一个参数。该文件中的每一行都是一个测试用例。每个测试用例将包含一个整数
本文向大家介绍JavaScript函数采用数字n并生成前n个素数的数组,包括了JavaScript函数采用数字n并生成前n个素数的数组的使用技巧和注意事项,需要的朋友参考一下 我们需要编写一个JavaScript函数,该函数接受数字n,并返回包含前n个质数的数组。我们知道素数是只能被1整除的数,例如2、3、19、37、73等。 我们将首先编写一个检查给定数是否为质数的函数,然后运行循环以生成n个质
形成N的非素数对是2个不同的非素数,其中数的乘积是N。 1<=n<=10^6
我有一个数字列表,现在我想从列表中取一个数字,并检查有多少个元素可以将这个数字与余数除以0。 这是我的代码: 对于示例输入: 输出是: 但是此代码以 的时间复杂度运行。但是我的输入列表大小范围最大为 10 5,每个元素也在 1 到 105 之间。那么如何提高这个程序的时间复杂度呢?
我一直在努力解决Euler项目中的第5个问题,这就像 2520是可以被1到10中的每一个数字除以而没有任何余数的最小数字。 可以被1到20的所有数字整除的最小正数是多少? 我决定更进一步,我决定找到一个最小的正数,它可以被从1到limit的所有数字平均整除,limit是用户定义的。 当我执行程序时,问题开始出现,它立即打印出0。我试图追踪我的代码,但没有成功。