Hi Experts,

I am trying to develop an algorithm which involves the selection of an immediate minimum and maximum limit when an input is provided.

For instance I have a list of numbers which increment equally;

-20, -16, -12, -8, -4, 0, 4, 8, 12, 16, 20

If this algorithm recieves an input of 3, then as I know the set of numbers increment equally in 4 then the minimum and maximum to extract is 0 and 4 respectively. If the input is -13 then the minimum and maximum is -16 and -12 respectively.

Is there an algorithm already out there that implements, if not can someone guide to an eficient way of developing this?

regards Imran

###### Who is Participating?

Commented:
If the sequence is always evenly spaced and centered on zero, you can do:

int min;
int max;
int n;
int k;
// n = test number
// k = spacing (4 in your example)

int m = n%k;
if ( m < 0 ) m += 4;
min = n-m;
max = n-m+4;

If the series is offset from 0, then you need to do a bit more computation to adjust:

max += offset;
min += offset;
if ( min > n )
{
max = min;
min = max - k;
}
else if ( max < n )
{
min = max;
max = min + k;
}
0

Author Commented:
Hi drichards

Thankyou for your prompt reply. I am going to implement this with some more test cases that I have.

Would this method work when decimal values are involved with the same condition that they are equally spaced?

regards Imran
0

Commented:
You can use a similar algorithm with decimal types using the decimal.Remainder method rather than the % opoerator:

decimal d; // test number
decimal k; // spacing
...
decimal d2 = decimal.Remainder(d,k);
if ( d2 < 0 ) d2 = k+d2;
decimal min = d-d2;
decimal max = min + k;

For doubles you would have to write your own remainder function as I didn't find one in .NET - maybe it's there and I just didn't find it.  Be careful about rounding errors though.

double d; // test number
double k; // spacing
...
double d2 = -Math.Floor(d/k)*k + d;  // Compute remainder
if ( d2 < 0 ) d2 = k+d2;
double min = d-d2;     // Be careful about rounding here
double max = min + k; // and here
0

Author Commented:
Hi drichards,

I presume the remainder functionality doest apply to floats either?

regards Imran
0

Commented:
Correct.  You can convert floats to doubles and use the double formula.
0

Author Commented:
Hi drichards,

I applied your algorithm to my application and it seems to work and cover all conditions.

regards
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.