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

给定n,求出有多少个n位数字,使得这个数字在素数索引处有素数,并且可以被m整除?

曾飞沉
2023-03-14

特殊数字是这样的,即在素数指数上有素数位(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

共有1个答案

宣煜
2023-03-14

由于逐位数的递归可以使它们相互依赖,因此对小于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。我试图追踪我的代码,但没有成功。