Да там надо было привести к циклу do-while, просто лень было. Вот и сделал k = numb / 2 + 1, чтобы при первом заходе k всегда была больше 2. Так что, если убираешь +1, то переделай в do-while.
Насчёт кода внутри цикла. Тут используется уменьшение k, чтобы не было лишних поисков. Например, число 100 делится на 2, но также делится на 50, делиться на 4, но также на 25 и т.д. При делении на 2 без остатка понятно, что есть 2 делителя, а искать свыше 50 будет лишним, при делении на 4 без остатка понятно, что есть 2 делителя, а больше 25 уже нет, так как 50 уже посчитали. Вот и идёт инкремент divnumb в случае, если numb/i больше i (в случае, когда numb/i равно i инкремент не происходит, например 9/3==3).
Если знать особенности начального и конечного значений поиска, то возможно ускорить работу используя кэш. Например, в каком диапазоне предполагаются начальные значения (argv[1]) в разных запусках программы?
Думаю, что и этот код не оптимизирован достаточно.