2

我必须确定数学公式来计算一系列数字中的特定重复位置。数字列表无限重复,我需要在此列表中找到每n 个数字的数字。所以我想在重复y数字的列表中找到*n *th 项。

例如,如果我的列表有 7 位数字 (y=7),并且我需要每 5 个项目 (n=5),我如何找到该项目?该列表将是这样的(为了便于查看,我将其分为五组):

12345 67123 45671 23456 71234 56712 34567

我需要在第一个分组中找到 5,然后在第二个分组中找到 3,然后从第三组中找到 1,然后是 6,然后是 4,然后是 2,然后是 7。

这需要适用于yn的任何数字。我通常使用模数来查找*n *th 个项目,但仅当列表数量不断增加且不重置时。

我正在尝试在 Javascript 或 JQuery 中执行此操作,因为它是基于浏览器的问题,但我不是很数学,所以我正在努力解决它。

谢谢!


编辑:我正在寻找一个理想的数学解决方案,但我会更多地解释这个问题,但这可能只会增加混乱。我有一个旋转木马排列的物品清单。在我的示例中,有 7 个唯一项目(可以是任何数字),但实际列表实际上是该大小的五倍(与上面的 5 个组无关),其中包含我创建的四组重复项。

为了产生滚动到无限远的错觉,列表位置在“最后”页面上重置(在此示例中有两个页面,因为项目 1-7 跨越了 5 个项目宽的视口)。上面的这些组代表页面,因为在我的示例中每页有 5 个项目。重复项提供了必要的填充,以填充在移动到下一页项目时可能出现的任何空白(例如,第 2 页以 6 和 7 开头,但如果不是重复的 1,2 和3)。当页面越过最后一页时(因此,如果我们尝试转到第 3 页),我会将它们重新定位到列表中的第一页,但会偏移,因此看起来它们仍然会永远向前。

这就是为什么我不能使用数组索引以及为什么有一个数学解决方案会很有用。我意识到那里有旋转木马可以完成与我想要实现的任务类似的任务,但我必须使用我拥有的那个!

4

6 回答 6

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

于 2013-04-30T14:37:19.380 回答
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 的算法。

于 2013-04-30T14:49:32.413 回答
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/

于 2013-04-30T18:46:11.027 回答
0

纯粹的数学定义?呃..

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.

这与您将要进行的数学运算一样。

很好的简单递归关系,在那里很好地描述了它。

于 2013-04-30T16:56:20.990 回答
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]

http://jsfiddle.net/xRFTD/

于 2013-04-30T20:49:01.027 回答
-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 
}
于 2013-04-30T14:39:08.990 回答