2013-04-30 93 views
2

我必须确定数学公式来计算一系列数字中的特定重复位置。数字列表无限次重复,我需要在此列表中找到每个n数字中的数字。所以我想在数字列表中找到* n * th项。例如,如果我的列表有7位数字(y = 7),并且我需要每隔5个项目(n = 5),那么我如何找到该项目? 该列表将是这样的(这在我五岁以下儿童进行了分组为了便于观察):找到固定项目重复列表中的第n项

12345 67123 45671 23456 71234 56712 34567 

我需要在第一分组数5找到,然后在第二个分组编号3,然后从1第三组中,然后如图6所示,然后如图4所示,然后如图2所示,然后7.

这需要用于任何数目的连续工作ÿñ。我通常使用模数来查找* n * th项,但只有当列表数量不断增加并且不重置时。

我想在Javascript或JQuery中这样做,因为它是一个基于浏览器的问题,但我不是很数学,所以我正在努力解决它。

谢谢!


编辑:我在寻找一个数学解决这个理想,但我会解释一下这个问题,但它可能只是添加混乱。我有一个旋转木马安排中的物品清单。在我的例子中,有7个独特的项目(它可以是任意数量),但实际上这个列表实际上是这个大小的五倍(与上面的5个小组无关),而我创建了四组重复项。

为了给滚动到无限的错觉,列表位置在'最后'页面上重置(本例中有两页,因为项目1-7跨越5个项目宽的视口)。上面的这些组代表页面,因为在我的示例中每页有5个项目。重复项提供必要的填充以填充移动到下一页项目时可能出现的空白空间(例如,第2页以6和7开头,但如果不是用于重复的1,2和6则为空) 3)。当页面越过最后一页(所以如果我们试着去第3页),我将它们重新放置在第一页的列表中,但是抵消了,所以它看起来像它们还在永远向前。

这就是为什么我不能使用数组索引以及为什么它有一个数学解决方案。我意识到那里有一些传送带可以完成类似的任务,但我必须使用我所拥有的传送带。

+0

能否发布您列表,或者作为json的一部分?目前还不清楚它包含的是什么类型的数据。 – georg 2013-04-30 14:43:47

+0

分组数字是否总是以空格分隔? – Corey 2013-04-30 14:47:46

+0

这里没有真正的清单。在我的例子中(它会改变)我有一个“真实”的7个项目列表,在列表两边填充4个重复列表,以及5个项目的滑动视口。我基本上试图预测当自动定时器启动时页面需要移动到下一组5个项目。手动选择下一个很好,我已经有了一切工作正常。我只能访问项目1到项目7的活动索引。希望我有道理! – 2013-04-30 15:44:53

回答

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

+0

对不起,我从未明确表示该解决方案需要数学计算,因为我没有以这种方式列出我的数据,我也无法做到这一点。 – 2013-04-30 15:45:49

+0

@StuartRadley:哦,我明白你的意思了。循环应该持续多久?即你想要多少结果? – musefan 2013-04-30 16:20:34

-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 
} 
+0

我不确定真正的数据是否包含空格,我可能错了 – musefan 2013-04-30 14:41:41

+0

我没有空格'i = i + x + 1;'应该替换为'i = i + x;' – 2013-04-30 14:42:34

+0

不,真正的数据烦人复杂,并且不存在于传统方式中:D – 2013-04-30 15:51:44

0

如果你的输入序列没有终止, n输出每个第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 。

+0

嗯...除了你的答案,其他每个帖子downvoted? – musefan 2013-04-30 15:29:43

+0

这个coule很有用。我正在研究它。因此,根据我的顺序(总是以1为增量1到N),我可以指定组大小(5)和总项目数(7)来查找每个第五项? – 2013-04-30 15:51:08

+0

@musefan你打算从中得出一个结论吗? – 2013-04-30 15:59:16

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

这就像数学一样,你会得到这样的。

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

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/

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/

+0

该函数适用于所有正X,A,B。 – jgroenen 2013-05-01 15:54:27