2013-04-30 97 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