2015-04-24 39 views
1

所以我有一個問題,我有一個長度的數組(通常很長)。我有一個初始開始索引到該數組和一個跳過值。所以,如果我有這樣的:算法,涉及舍入和倍數

var initial = 5; 
var skip = 10; 

然後我會遍歷我數組索引5,15,25,35,等 但我可以得到一個新的起點價值,我需要找到最初的值加上或減去跳過的倍數,然後開始跳過。所以,如果我的新的值是23,那麼我迭代25,35,45,等

算法我對這個是:

index = (round((start - initial)/skip) * skip) + initial 

然後我需要檢查,看是否有指標降至零下:

while(index < 0) index += skip; 

所以我的第一個問題是,如果有這樣的名字?多重隨機啓動? 我的第二個問題是,如果有更好的方法?我不認爲我所擁有的非常複雜,但如果我錯過了一些我想知道的事情。

如果有關係我正在使用javascript。

謝謝!

+0

因此,您可能獲得的新價值與跳過或初始值無關,對嗎?而這個價值可能是負面的? –

+0

@AlfonsoGarnett:新值將在數組索引的範圍內,所以它不應該是負數,但是你是對的,它與skip或initial都沒有關係。謝謝! – rjcarr

回答

1

編輯

而不是

while(index < 0) index += skip; 

如果我們假定這兩個初始跳過是積極的,你可以使用:

if (index < 0) index = initial % skip; 
+0

感謝您的幫助,但我不確定只是設置爲0將工作。如果我的初始值是10而我的跳躍值是7,該怎麼辦?根據新的價值,我可能會得到類似-11的東西。但是我不能把它變成0,因爲它需要是跳過的倍數。所以它需要是3還是我錯過了什麼? – rjcarr

+0

編輯完成後,謝謝!,這似乎是正確的。我認爲它不會超過兩次小於零的跳躍,所以我會做兩次測試和一項任務,而你們只做一次測試和一項任務,至少在一次聲明中更好!而爲了我所做的每一個保存的聲明都很有用,謝謝! – rjcarr

1

無需while循環:

function newNum(newstart, initial, skip) { 
    var xLow = newstart + Math.abs(newstart - initial) % skip; 
    var xHi = newstart + skip; 
    var result = (xLow + xHi)/2 > newstart ? xLow : xHi; 
    if (result < 0) result += skip; 
    return result; 
} 

把你的新起點和你的初始值之間的距離,並找出如果你走向這個初始值(模量給我們),剩下的將是什麼。然後你只需要知道最近的點是在起始點之前還是之後(我是這樣比較低值和高值的中點到起點)。

測試:

newNum(1, 20, 7) = 6 
newNum(-1, 20, 7) = 6 
newNum(180, 10, 3) = 182 

(即使你在你的評論指出,新的起點的範圍是數組邊界內,發現它並不真正的問題)。

+0

也許我沒有解釋得很好,但考慮到你的3次測試,我預計結果是:6,6,和181.所以,初始和跳過設置了所有可能的結果。所以,如果你有20的初始值,跳過7,那麼可能的結果是20,27,34,41等,並以20,13,6的方式進行。 – rjcarr

+0

啊...是的,我沒有聽清楚。我會編輯答案。 –

+0

唯一需要做的更改是將模數添加到哪個點。我希望你看到這類問題使用了模數而不是一個while循環。你所說的問題非常像一個家庭作業問題,所以如果是這樣,我希望這是外賣。 –

1

要獲得number的最接近倍數爲test number:看看你的test numbermodulo大於number/2如果是的話,返回number - modulo

function closestMultiple(multipleTest,number) 
{ 
    var modulo = multipleTest%number; 
    if(0 == modulo) 
    { 
     return multipleTest; 
    } 
    else 
    { 
     var halfNumber = number/2; 

     if(modulo >= halfNumber) 
     { 
      return multipleTest + (number-modulo); 
     } 
     else 
     { 
      return multipleTest - modulo; 
     } 
    } 
} 

要檢查數量是多另一個則其模比較0:

function isMultiple(multipleTest,number) 
{ 
    return 0 == multipleTest%number; 
} 

您可能要在情況下添加一些驗證爲0,你希望的任何內部closestMultiple。

1

index你把它

index = round((start - initial)/skip) * skip + initial 

計算的值確實是該序列之間的距離最小化以一般術語

一個 j中的一個 = j * skip + initial

start

因此,index只能是負如果start在於到的

(一個 -1 +一個)如果/ 2 = initial - skip/2

換句話說,

start < initial - skip/2. 

所以,只有在這種情況下,您必須重新定義index0。在僞代碼:

IF (start < (initial - skip/2)) 
    index = 0 
ELSE 
    index = round((start - initial)/skip) * skip + initial 

或者,你可以做

index = round((start - initial)/skip) * skip + initial 
IF index < 0 THEN index = 0 

這是相同的。

+0

感謝您的信息;我會仔細看看你寫的是什麼。但是,我不認爲我可以將索引設置爲0.正如我在另一條評論中所說的:如果我的首字母是10,我的字母是7,該怎麼辦?根據新的價值,我可能會得到類似-11的東西。但是我不能把它變成0,因爲它需要是跳過的倍數。所以它需要是3. – rjcarr

+0

它看起來像'索引'的含義混淆。 Index是從'initial'開始時必須「跳過」的整數次數。你得到的最接近的點不是'index',是'start + index * skip'(在我的符號中,一個索引)。 –