Можно так: сумма всех единиц от 1 до n равна n, поэтому в цикле её прибавлять не будем, просто в конце добавим n. В цикле будем только считать дроби и всё складывать. цикл делаем из целочисленных переменных.
double sum1 (int n) { int i;
double tmp, acc = 0.0;
for (i = 1; i <= n; i++) {<br> tmp = (double)i; // преобразование типов tmp *= tmp; // возведение в квадрат acc += 1.0/tmp; // добавляем дробь к аккумулятору } return acc + (double)n; // в конце добавляем сумму единиц}
Второй способ: можно дроби привести к общему знаменателю:
И уже такую штуку вычислять в цикле (в квадрат возводить, само собой, один раз на одну итерацию цикла). Возможно такой метод даст бОльшую точность при больших n, когда начнём приближаться к пределу по разрядной сетке, но тут на 100% не поручусь.
double sum2 (int n) { int i; double tmp, acc = 0.0; for (i = 1; i <= n; i++) { tmp = (double)i; // преобразование типов tmp *= tmp; // возведение в квадрат acc += (tmp+1.0)/tmp; // вычисление выражения и прибавление к аккумулятору } return acc;}<br>