我必须确定数学公式来计算一系列数字中的特定重复位置。数字列表无限重复,我需要在此列表中找到每个 n 数字的数字。所以我想在重复的 y 数字列表中找到 * n *项。
例如,如果我的列表有7位数(y = 7)并且我需要每5个项目(n = 5),我该如何找到该项目? 列表将是这样的(为了便于查看,我将其分为五个部分):
12345 67123 45671 23456 71234 56712 34567
我需要在第一个分组编号5中找到,然后在第二个分组编号3中找到,然后从第三个组中找到1,然后是6,然后是4,然后是2,然后是7。
这需要适用于 y 和 n 的任何数字。我通常使用模数来查找 * n *项,但仅限于列表数量不断增加且未重置时。
我试图在Javascript或JQuery中这样做,因为它是一个基于浏览器的问题,但我不是很数学,所以我很难解决它。
谢谢!
编辑:我正在寻找一个理想的数学解决方案,但我会更多地解释这个问题,但它可能只会增加混乱。我有旋转木马安排的项目清单。在我的例子中有7个独特的项目(它可以是任何数字),但实际上的列表实际上是这个大小的五倍(与上面5个组无关),我创建了四组重复项。
为了给出滚动到无穷大的错觉,列表位置在“最后”页面上重置(在此示例中有两个页面,因为项目1-7跨越5个项目宽视口)。上面的那些组代表页面,因为我的示例中每页有5个项目。重复项提供了填充移动到下一页项目时可能出现的任何空白所需的填充(例如,第2页以6和7开头,但如果不是重复的1,2和3)。当页面经过最后一页时(如果我们尝试转到第3页),那么我将它们重新定位在列表中的第一页,但是偏移,所以看起来它们仍然是永远向前发展。
这就是为什么我不能使用数组索引以及为什么使用数学解决方案会有用。我意识到那里有旋转木马,它们的功能与我想要达到的相似,但我必须使用我所拥有的那个!
答案 0 :(得分:3)
只需循环每5个字符,如下所示:
var data = "12345671234567123456712345671234567";
var results = [];
for(var i = 4; i < data.length; i += 5){
results.push(data[i]);
}
//results = [5, 3, 1, 6, 4, 2, 7]
如果你想使用变量x = 5;
,你的for循环将如下所示:
for(var i = x - 1; i < data.length; i += x){...
无需了解y
答案 1 :(得分:0)
如果您的输入序列没有终止,那么输出每个第n个项目最终会产生自己的重复序列。此重复的周期(长度)将是输入序列(y
)的周期的最小公倍数和用于输出其项目的步长(x
)。
如果你只想输出第一次重复,那么这样的事情应该可以做到(未经测试):
var sequence = "1234567";
var x = 5;
var y = sequence.length;
var count = lcm(x, y);
var offset = 4;
var output = [];
for (var i = 0; i < count; i += x)
{
j = (offset + i) % y;
output.push(sequence[j]);
}
你应该能够很容易地找到一种计算两个整数的LCM的算法。
答案 2 :(得分:0)
纯粹的数学定义? ERR ..
T(n) = T(n-1) + K For all n > 0.
T(1) = K // If user wants the first element in the series, you return the Kth element.
T(0) = 0 // If the user want's a non-existent element, they get 0.
Where K denotes the interval.
n denotes the desired term.
T() denotes the function that generates the list.
Lets assume we want every Kth element.
T(1) = T(0) + K = K
T(2) = T(1) + K = 2K
T(3) = T(2) + K = 3K
T(n) = nk. // This looks like a promising equation. Let's prove it:
So n is any n > 1. The next step in the equation is n+1, so we need to prove that
T(n + 1) = k(n + 1).
让我们一起去吧。
T(n+1) = T(N+1-1) + K.
T(n+1) = T(n) + K
Assume that T(n) = nk.
T(n+1) = nk + k
T(n+1) = k(n + 1).
通过归纳,你的证明是T(n) = nk
。
这就像数学一样,你会得到SO。
很好的简单递归关系,很好地描述了它。
答案 3 :(得分:0)
编辑后我再做一个解决方案;)
var n = 5, y = 7;
for (var i = 1; i<=y; i++) {
var offset = ( i*y - (i-1)*n ) % y;
var result = 0;
if (offset === n) {
result = y;
} else {
result = (n - offset) > 0 ? n - offset : offset;
}
console.log(result);
}
输出中的[5,3,1,6,4,2,7]。
JSFIDDLE: http://jsfiddle.net/mcrLQ/4/
答案 4 :(得分:0)
function get(x, A, B) {
var r = (x * A) % B;
return r ? r : B;
}
var A = 5;
var B = 7;
var C = [];
for (var x = 1; x <= B; ++x) {
C.push(get(x, A, B));
}
console.log(C);
结果: [5,3,1,6,4,2,7]
答案 5 :(得分:-1)
var data = "12345 67123 45671 23456 71234 56712 34567";
var x = 5;
var y = 7;
var results = [];
var i = x - 1; // enumeration in string starts from zero
while ( i <= data.length){
results.push(data[i]);
i = i + x + 1;// +1 for spaces ignoring
}