2017-09-04 38 views
-1

隨着一系列具有STARTINCREMENTMAX算法來處理一系列的值

START = 100 
INCREMENT = 30 
MAX = 315 

e.g. 100, 130, 160, 190, 220, 250, 280, 310 

給定任意數量的X回報:剩餘的系列

  • 值,其中第一個值是>= X
  • 偏移量Y(追趕從X到系列第一個值所需的數量)。

In: 
START = 100 
INCREMENT = 30 
MAX = 315 
X = 210 

Out: 
Y = 10 
S = 220, 250, 280, 310 

UPDATE - 從MBO答案:

float max = 315.0; 
float inc = 30.0; 
float start = 100.0; 
float x = 210.0; 

float k0 = ceil((x-start)/inc) ; 
float k1 = floor((max - start)/inc) ; 

for (int i=k0; i<=k1; i++) 
{ 
    NSLog(@" output: %d: %f", i, start + i * inc); 
} 


output: 4: 220.000000 
output: 5: 250.000000 
output: 6: 280.000000 
output: 7: 310.000000 

MBO整數方法將是更好。

+0

爲什麼-1?不是一個完整的問題?我問,因爲我不希望在未來遭到毆打。 – ToddB

+0

可能想 - 因爲自己的努力還沒有被證明 – MBo

回答

1

學校數學:

Start + k0 * Inc >= X 
k0 * Inc >= X - Start 
k0 >= (X - Start)/Inc 

編程數學:

k0 = Ceil(1.0 * (X - Start)/Inc) 
k1 = Floor(1.0 * (Max - Start)/Inc) 
for i = k0 to k1 (including both ends) 
    output Start + i * Inc 

整型數學運算:

k0 = (X - Start + Inc - 1)/Inc  //such integer division makes ceiling 
k1 = (Max - Start)/Inc    //integer division makes flooring 
for i = k0 to k1 (including both ends) 
    output Start + i * Inc 

例子:

START = 100 
INCREMENT = 30 
MAX = 315 
X = 210 

k0 = Ceil((210 - 100)/30) = Ceil(3.7) = 4 
k1 = Floor((315 - 100)/30) = Floor(7.2) = 7 
first 100 + 4 * 30 = 220 
last 100 + 7 * 30 = 310 
+0

我應用這個針對我的實施例1和其中如下 輸出的值:3:190 輸出:4:220 輸出:5:250 輸出:6:280 – ToddB

+0

也許你改變了細胞和地板操作。查看示例 – MBo

+0

我更新了我的問題,可以查看我正在使用的代碼嗎? – ToddB

1

解決不等式

X <= S + K.I <= M 

這相當於

K0 = Ceil((X - S)/I) <= K <= Floor((M - S)/I) = K1 

Y = X - (S + K0.I). 

注意,有可能有K0 > K1,並沒有解決。