Выражение для вычисления поля в цикле - PullRequest
1 голос
/ 11 января 2010

У меня есть несколько переменных

0 < na < 250
0 < max <= 16
nb = (na + max - 1) / max

n имеет следующие характеристики

0 <= i < nb - 1 => n = max
i = nb - 1 => n = na - i * max

Есть ли простой способ сделать это без троичного оператора?

for (i = 0; i<nb;i++) {
    n = ((i + 1) * max > na ? na - (i * max) : max);
}

Примеры

na = 5
max = 2
nb = 3

i = 0 => n = 2
i = 1 => n = 2
i = 2 => n = 1

na = 16
max = 4
nb = 4

i = 0 => n = 4
i = 1 => n = 4
i = 2 => n = 4
i = 3 => n = 4

na = 11
max = 3
nb = 4

i = 0 => n = 3
i = 1 => n = 3
i = 2 => n = 3
i = 3 => n = 2

Ответы [ 3 ]

4 голосов
/ 11 января 2010

Вопрос не очень понятен. Возможно, вы ищете что-то вроде этого:


for (i=0;i < nb;++i)
{ 
    n = i < nb - 1 ? max : (na - 1) % max + 1;
} 
2 голосов
/ 11 января 2010

Вам не нужно рассчитывать NB. Это один из способов сделать это (C #):

int na = 11;
int max = 4;

for (int i = 0, x = 0; x < na; i++, x += max)
{
     int n = Math.Min(max, na - x);
     Console.WriteLine("i = {0}, n = {1}", i, n);
} 

Выход:

i = 0, n = 4
i = 1, n = 4
i = 2, n = 3
1 голос
/ 11 января 2010

Просто чтобы добавить больше путаницы в тему:

Если вы печатаете max только в первых двух случаях, вы можете сделать что-то вроде: (не на каком-либо конкретном языке)

//for 0
printf("i = %d, n = %d\n",i,max)
//for 1
printf("i = %d, n = %d\n",i,max)
//for the rest
for (i = 2; i<nb;i++) {
     printf("i = %d, n = %d\n",i,na - (i * max));
}

Вы можете избежать оператора, делающего два для циклов

for (i = 0; (i + 1) * max) > na AND i < nb;i++) {
     printf("i = %d, n = %d\n",i,0);
}
for (; i<nb;i++) {
     printf("i = %d, n = %d\n",i,na - (i * max));
}
...