Це добре, значить є сенс розписувати.
Завдання, які ви тут викладаєте, створюють враження, що вашого викладача ОП колись на уроці інформатики покусав математик
Конкретно по цьому завданню - цей вираз не має сенсу при k>=2; можу припустити, що там переплутані числівник і знаменник, тоді ряд непогано сходиться. Можна також припустити, що в знаменнику має бути i2+4, але не думаю, бо тоді воно розбігається, про що ви й питали.
Тепер по коду.
Звісно, можна обчислювати факторіал у кожній ітерації, але можна помітити, що при першій ітерації значення виразу (i+1)! буде 2, при другій - 6, при третій - 24, ..., при i-й він збільшується в i+1 разів. Тобто його можна також накопичувати в окремій змінній, без внутрішнього циклу. Те саме, і навіть простіше, стосується (-1)i - цей вираз просто змінює знак туди-сюди, він не потребує обчислення експоненти. Десь так:
float factorial = 1., sign = 1, total = 0.;
for(int i=1;i<=k;++i)
{
sign = -sign;
factorial *= (i+1);
total += sign * factorial / (i*i-4); //цей вираз треба виправити відповідно до виправлення умови
}
printf("%f",total);
Можна звернути увагу, що нас не дуже цікавлять окремі значення sign та factorial, і їх можна об'єднати:
float signed_factorial = 1., total = 0.;
for(int i=1;i<=k;++i)
{
signed_factorial *= -(i+1);
total += signed_factorial / (i*i-4); //але тоді можуть виникнути проблеми при виправленні виразу
}
printf("%f",total);
Загалом метод обчислення через попереднє значення зветься рекурсією, але в практичному програмуванні ця назва закріпилася за рекурсивними функціями.
І ще раджу давати змінним імена, які щось означають. На наборі ви зекономите значно менше часу, ніж витратите потім на спроби прочитати, що у вас відбувається. Тут добре видно, що обчислюється факторіал зі знаком та загальна сума; що таке f та w - можна лише здогадуватися.