C/C++

Решите 2 задачи на C++

Желательно не использовать сложный (заумный) синтаксис
1) Берём и вычисляем сумму, храня при этом последнюю степень тройки и счётчики. Цикл завершается, когда очередное слагаемое ряда меньше или равно заданной точности. Поскольку это знакопеременный ряд, такой критерий достаточен. Чередование знака обеспечиваем в том месте, где идёт умножение (в данном случае - в степени тройки).
 const double PRECISION = 0.001;
double sum = 1.0;
long numerator = 0;
double pow3 = -1.0;
double step;
do {
pow3 *= -3.0;
numerator += 2;
step = numerator / pow3 / (numerator + 1);
sum += step;
} while (step > PRECISION);
2) Полностью аналогично.

Есть нюанс: если числитель и знаменатель растут быстро, то мы можем выйти за границы типа раньше, чем достигнем точности. Тогда нельзя хранить числитель и знаменатель по отдельности, а нужно хранить слагаемое целиком и с ним выполнять операции. Но в этих заданиях - не тот случай.
Летушев Юрий
Летушев Юрий
87 571
Лучший ответ
#include <iostream>
#include <iomanip>
using namespace std;
int sign(int value) {
return value < 0? 1 : -1;
}
int main() {
auto sm = 0.;
auto m = 1.;
auto s = 1;
for (auto n = 0; fabs(m) > 1e-5; ++n) {
s = sign(s);
auto n2 = 2. * n;
m = n ? (s * n2) / ((n2 + 1) * pow(3, n)) : 1;
sm += m;
}
cout << fixed << setprecision(3) << sm << '\n';
system("pause > nul");
}
Игорь Лазебный
Игорь Лазебный
51 436
Александр Сагайдак а можно попроще?
Включи режим "подумать самому", говорят работает.
Serg Morelly
Serg Morelly
474