Как масштабировать значения по счетчику - PullRequest
1 голос
/ 01 мая 2020

У меня есть пять целочисленных значений

std::vector<int> vec(5, 0);

значение каждого целого будет основано на счетчике.

если счетчик равен 0, то все целые числа будут 0

если счетчик равен 100, то все целые будут иметь значение 20

, поэтому, когда счетчик равен 20, первое целое будет иметь значение 20, а остальные - 0.

когда счетчик равен 30, первое int будет равно 20, а второе int будет 10

Это мой код для этого. Мне интересно увидеть другие логики для достижения этого,

std::vector<int> vec(5, 0);
    int counter = 50;
    for (int i = 0; i < 5; i++)
    {
        int startValue = (i) * 20;
        int finalValue = counter - startValue;

        if (finalValue > 20)
            finalValue = 20;

        if (finalValue < 0)
            finalValue = 0;

        vec[i] = finalValue;
    }


    for (auto &v : vec)
    {
        std::cout << v << std::endl;
    }

Ответы [ 3 ]

1 голос
/ 01 мая 2020

Другой способ состоит в том, чтобы предварительно рассчитать, сколько элементов должно быть установлено на 20 и что осталось для следующего элемента, а затем оставить остальные на 0.

    const int maxValue = 20;
    int fullCells = counter / maxValue;
    int lastValue = counter % maxValue; 

    for (int i = 0; i < fullCells; i++)
    {   vec[i] = maxValue; }
    if (lastValue)
    {   vec[fullCells] = lastValue; }
1 голос
/ 01 мая 2020

Я не проверял это, но если вы ищете что-то «умное», попробуйте это:

int counter = 30;
for( int i = 0; i < 5; i++ ) {
    if( counter <= 20 * i ) {
        vec[i] = 0;
    } else {
        vec[i] = (counter > 20 * (1 + i)) ? 20 : counter % 20;      // how I think, or
        vec[i] = (counter - (20 * i) > 20) ? 20 : counter - 20 * i; // how you do it
    }
}

Возможно, вы могли бы микрооптимизировать l oop, чтобы заменить второе умножение с добавлением, но вы вряд ли оптимизируете лучше, чем компилятор с его опцией разворачивания l oop.

Я не заядлый пользователь StackOverflow (пока), но этот вопрос кажется было бы лучше разместить на Code Review , на основе этот ответ на Meta

1 голос
/ 01 мая 2020
while(counter>0&&i<5)
{
    if(counter>=20)
    {
        vec[i]+=20;
        counter-=20;
    }
    else
    {
        vec[i]+=counter%20;
        counter=counter-counter%20;
    }
    i++;
}

По сути, каждый раз он сокращает счетчик на 20 или% 20 и устанавливает его в массив. Это также полезно для работы с слишком большими числами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...