给定一个掩码数,计算所有可能被 n 整除的数
Posted
技术标签:
【中文标题】给定一个掩码数,计算所有可能被 n 整除的数【英文标题】:Given a masked number, count all the possible number divisible by n 【发布时间】:2017-11-29 08:04:33 【问题描述】:我有一个动态编程练习,但我不知道它在这里如何工作:
我们有一个神秘的数字是一个由数字和星号*组成的字符串。 给定一个神秘数,计算所有可能的自然数,将星号 * 替换为一个数字,得到一个可被 n 整除的整数。 例如:
对于 1*1* 和 n = 6,有 16 个可能的数可以被 n 整除:1014, 1110, 1116, 1212, 1218, 1314, 1410, 1416, 1512, 1518, 1614, 1710, 1716, 1812, 1818, 1914.
如果有一个前导星号,那么它不应该被零替换:
*12 -> 112(可以)但 *12 -> 012(不可以)
输入:
1
1
时间限制:
在 C++ 语言中为 500 毫秒。正如我所说,这是一个动态编程练习。
谁能给我一些提示?
【问题讨论】:
您是否提前知道n
的值,或者那是您程序输入的一部分? (如果事先知道可能有捷径:对于n=6
,最后一个数字必须是偶数,并且数字之和必须是3的倍数。)如果事先不知道n
,那么暴力破解是否有问题(用数字替换星号并用n
除以测试所有可能性)?您的编程语言中的字符串大小或整数大小是否有限制?好的解决方案需要这些细节。
抱歉我的错误,n 是事先不知道的:n 在 1-1000 的范围内,神秘数字的大小在 1 -1000 的范围内,时间限制为 500ms,使用 C++ 语言。所以我不认为会有蛮力@RoryDaulton的地方
如果你需要我可以给你递归算法的代码。但不知道动态。 500毫秒也是很多时间!!!!!!这个算法只需要 1ms
我同意:500 毫秒是很多时间。考虑到您的限制,最多可以通过蛮力轻松完成 3 颗星。
【参考方案1】:
我为你写了一个 javascript 它可以工作,你可以把它改成 c++, 也给你留言。它使用递归来处理和替换左边的每个 * 并用可能的数字替换它
var string = "sample mystriuos number"
function Func(mysNumber , n )
// this function
var realnumber = true // a check if number is not mystrius anymore!!
for (var i=0 ; i<= mysNumber.length ; i++)
if(i !=0 && mysNumber[i]=="*") // for Not left number
realnumber= false
for(var j=0 ; j<=9 ;j++ )
Func(mysNumber.substring(0,i) + j.toString() + mysNumber.substring(i+1,mysNumber.length) ,n)
else if (mysNumber[i]=="*") // for left number
realnumber = false
for(var j=1 ; j<=9 ;j++ )
Func(mysNumber.substring(0,i) + j.toString() + mysNumber.substring(i+1,mysNumber.length) ,n)
if(realnumber)
if(parseInt(mysNumber) % n ==0)
print(mysNumber)
func(string , 6)
【讨论】:
以上是关于给定一个掩码数,计算所有可能被 n 整除的数的主要内容,如果未能解决你的问题,请参考以下文章