我很难弄清楚如何让它工作,所以我来寻求这里聪明人的帮助。
问题是,我想反转以下等式的过程,以便我从给定的Y
中得到X
并Z
。
Z = [ ( X * 30 ) % Y ]
对于用例,用户输入数字Y
然后按 ENTER,系统将获得当前服务器时间,然后将其乘以 30。然后,用户将以格式HHMMssxxx
(嗯,xxx
这里是毫秒)获得剩余的服务器时间。我不知道毫秒的格式字母。.呵呵..),除以Y
- 即(X*30) % Y
其中X
是转换为 int 的当前服务器时间。
我怎样才能反过来做到这一点?
问题是,X
不应大于2359999
-> (23:59:59.999) 24 小时制的最大时间值。
据说我有Z = 32, Y = 400
,我怎么能找到X
?
我知道有可能有多个答案。这是我到目前为止提出的,但我认为这在性能方面不是很理想。
function getTimeIDx(rem, codeIndexer) {
var times = [];
for(var i = 0; i < 2400000; i++) {
if((i * 30) % codeIndexer == rem) {
var str = i.toString(),
l = str.length;
if(l < 9)
str = '000000000'.substr(0, 9 - l) + str;
str = str.substr(0, 2) + ':' + str.substr(2, 2) + ':' + str.substr(4, 2) + '.' + str.substr(6);
if(/^(?:[0-1]?d|2[0-3]):(?:[0-5]?d):(?:[0-5]+d)/.test(str))
times.push(str);
}
}
return times;
}
有没有办法更有效地做到这一点?有没有像反模这样的东西?
编辑:
更新了代码以检查字符串是否为有效时间。
您无法撤消它。模是除法运算的余数。
简化您的等式。 Z = Y % 2
Z 表示一半的值为 0,其余值为 1。
你不能只用余数和除数来解决股息。
让我们将其填充到等式中:
32 = ( X * 30 ) % 400
那么这意味着X * 30
是 400 加 32 的倍数:
32
432
832
...
现在我们可以将其除以 30 得到 x。这可以像这样在 js 中完成:
function* reverse(Z, Y) {
for(let n = 0; ; n++)
yield (Z + Y * n) / 30;
}
可用作:
for(let X of reverse(32, 400))
console.log(X);
请注意,此循环将永远运行,因为有无限的结果。试试吧