如何在C++中有效地找到具有给定余数的乘积
How can I find products with a given remainder efficiently in C++?
如果给我一个像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为底的对数大一。我开始写这样一个解决方案,但很快就偏离了轨道。使用额外的对数、乘法和除法可能会产生比字符串转换和子字符串搜索更慢的解决方案。
相关文章:
- 余数除法和不允许除以零 (c++) 时遇到问题
- 余数运算符的等效操作,用于处理低于允许的最小值
- 如何找到给定范围内除以给定数字时具有一定余数的值的数量?
- 计算浮点余数的最佳方法
- 使用c++中的循环反转余数
- 改进了计算余数的递归
- 如何计算余数有什么区别吗?
- 我如何检查 - 并使用 fmod(浮点数)获取余数
- 如何在将秒转换为分钟且余数小于 10 秒时包含前导零
- 如果任何余数的总和是奇数,则添加 11 *除非*添加 11 个原因
- 了解 std::fmod 和 std::余数
- 除法函数随机整数需要打印出商和余数
- C++11是否保证余数的符号就是被除数的符号
- 检查除法是否给出余数 0
- 正弦和余数的近似值
- 一种简化求余数的方法
- 为什么在C和C++中没有浮点/双精度的除法余数运算
- 根据 C++ 中的小数余数对平均值进行舍入
- C++余数以较高的数字返回 7
- 在C++中查找大乘法的余数