如果我得到一个像23,128,765这样的数字,并且我又得到两个数字9和3,我想计算对的数量,对于9和3,当除以9时,余数为3的子串是:3, 31,287,12和876。
如何使用C ++计算此类子串的数量?
一种可能的方法是计算所有可能的子串,但那是O(n ^ 2),但我想要比这更快的东西。
答案 0 :(得分:0)
您要求使用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)
这通过除数向上移动,并将每个潜在的产品转换为字符串,在上限数字的字符串表示中搜索该字符串。
在此过程中会创建许多字符串,但是找到一种操作整数以查看一个十进制表示是否出现在另一个十进制表示内的方法不适用于任何算术运算。例如,通过算术和检查二进制补码表示,无法确定数字131“是否包含”a 3。
嗯,让我们看看;也许你可以将候选数乘以10的因子,并且每个这样的乘积从原始数中减去它,然后检查差中的重要数字是否都为零,你可以使用模数运算符对10大于产品的基数-10对数。我开始编写这样一个解决方案,它很快就开始了。使用额外的对数,乘法和除法可能会产生比字符串转换和子字符串搜索更慢的解决方案。