2017-09-04 3 views
-1

Avec une série avec un START, INCREMENT et MAX:algorithme pour traiter avec des séries de valeurs

START = 100 
INCREMENT = 30 
MAX = 315 

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

Étant donné un nombre arbitraire X retour:

  • les valeurs restantes de la série où la la première valeur est >= X
  • le décalage Y (le montant de rattrapage nécessaire pour passer de X à la première valeur de la série).

Exemple

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

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

MISE À JOUR - De Mbo réponse:

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 

approche entière Mbo sera plus agréable.

+0

Pourquoi le -1? Pas une question bien formée? Je demande parce que je préfère ne pas me tromper à l'avenir. – ToddB

+0

peut supposer - car efforts ne sont pas représentés – MBo

Répondre

1

mathématiques de l'école:

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

mathématiques Programmation:

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 

math entier:

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 

Exemple:

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

j'ai appliqué ce contre mon exemple 1 et les valeurs où comme suit sortie: 3: 190 sortie: 4: 220 sortie: 5: 250 Sortie: 6: 280 – ToddB

+0

Peut-être avez-vous changé les opérations au plafond et au sol. Voir l'exemple – MBo

+0

J'ai mis à jour ma question, pouvez-vous regarder le code que j'utilise? – ToddB

1

Solve l'inéquation

X <= S + K.I <= M 

Cela équivaut à

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

et

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

Notez qu'il est possible d'avoir K0 > K1, et il n'y a pas de solution.