Создать диапазон чисел в C++

мне нужна помощь в определении диапазона чисел. У меня ошибка в коде и результат выглядит так:

Input: rangeStart = 1, rangeEnd = 23, periodLength = 10

Output: 1 2 3 4 5 6 7 8 9 10 11-20 21 22 23

Мне нужно, чтобы это было:

Input: rangeStart = 1, rangeEnd = 23, periodLength = 10

Output: 1-10 11-20 21 22 23

std::stringstream OptimizeDate(int rangeStart, int rangeEnd, std::string periodType, int periodLength){
    std::stringstream res;
    if (periodType == "whole"){
        for (int i = rangeStart; i <= rangeEnd; i++){
            double tmp = i % periodLength;
            if (tmp == 0) {
                res << i << std::endl;
                res << std::to_string(i + 1) + "-" + std::to_string(i + periodLength) << std::endl;
                i = i + periodLength;
            } else {
                res << i << std::endl;
            }
            
        }
    }
     
    return res;
}

Буду признателен за любой ответ


Ответы (2 шт):

Автор решения: needKVAS

Чисто исходя из ваших примеров ввода вывода:

for (int i = rangeStart; i <= rangeEnd; i++){
    int tmp =  i % periodLength ;
    int next = i + periodLength - 1;
    if (tmp == 1 && next <= rangeEnd) {
        res << std::to_string(i + 1) + "-" + std::to_string(i + periodLength) << std::endl;
        i = i + periodLength - 1;
    } else {
        res << i << std::endl;
    }
}

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

И, возможно, вам будет лучше использовать enum для periodType.

→ Ссылка
Автор решения: AR Hovsepyan

Лишние вызовы функций, создание объектов и арифметические действия, тормозят программу.Часто лучше просто генерировать числа с заданным шагом и стартовым значением, пока не достигли конца. Представлю вариант:

std::stringstream out;
int rangeStart = 1, rangeEnd = 23, periodLength = 10;
int k = rangeEnd / periodLength;
while (k--) {
    out << rangeStart << '-' 
        << rangeStart + periodLength - 1 << ' ';
    rangeStart += periodLength;
}
while (rangeStart <= rangeEnd)
    out  << rangeStart++ << ' ';
→ Ссылка