如何在C++中有效地找到具有给定余数的乘积

How can I find products with a given remainder efficiently in C++?

本文关键字:余数 C++ 有效地      更新时间:2023-10-16

如果给我一个像23128765这样的数字,再给我两个数字9和3,我想计算对的数量,使9和3的余数为3的子串除以9时为:31287、12和876。

如何使用C++计算此类子字符串的数量?

一种可能的方法是计算所有可能的子字符串,但这是O(n^2),但我想要比它更快的东西。

您要求使用C++,但在Common Lisp中有一个解决方案,在这种情况下更容易编写和演示:

(defun quotients-with-remainder-in (n divisor remainder)
  (loop with str = (format nil "~D" n)
        for i upfrom remainder to n by divisor
        when (search (format nil "~D" i) str)
          collect i))
> (quotients-with-remainder-in 23128765 9 3)
(3 12 876 31287)

这会向上移动除数,并将每个潜在乘积转换为一个字符串,a在上界数字的字符串表示中搜索该字符串。

这一过程中创建了许多字符串,但要想找到一种方法来操作整数,看看一个整数的十进制表示是否出现在另一个的十进制表示中,是不适合任何算术运算的。例如,要弄清楚数字131是否"包含"3,就无法通过算术和检查2的补码表示来完成。

好吧,让我们看看;也许你可以把候选数乘以因子10,然后对每个这样的乘积从原始数中减去它,然后检查差值中的重要数字是否都为零,对于这个问题,你可以使用模运算符来反对10的幂,比乘积的以10为底的对数大一。我开始写这样一个解决方案,但很快就偏离了轨道。使用额外的对数、乘法和除法可能会产生比字符串转换和子字符串搜索更慢的解决方案。