Задача: Сколько сомножителей надо взять в произведении: [latex]\prod_{k=1}^{\infty}{(1+\frac{{(-1)}^{k}}{2k+1})}=\frac{\sqrt{2}}{2}[/latex], чтобы равенство выполнялось до шестой значащей цифры, то есть с погрешностью не более [latex]{10}^{-6}[/latex]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <iostream> #include <math.h> using namespace std; int main() { double curr = sqrt(2.0)/2; //Переменная для сравнения double mul = 1; //Произведение double e = 1.0e-6; //Точность int count = 1; //Счетчик for(;fabs(mul - curr) > e;count++){ mul *= (1. + (count % 2 ? (-1) : 1)/(2.*count + 1)); } printf("%d",count); return 0; } |
Идея решения: Используем цикл for, в качестве [latex]k[/latex] в формуле используем переменную [latex]count[/latex] в программе. Переменную, которая будет соответствовать произведению, назовем [latex]mul[/latex] (сокращенно от multiplication) и присвоим ей значение 1 как нейтральный элемент для операции умножения. Каждую итерацию цикла проверяем разность [latex]mul-curr[/latex], где [latex]curr=\frac{\sqrt{2}}{2}[/latex], на превышение погрешности [latex]{10}^{-6}[/latex].
Если разность больше точности, умножаем [latex]mul[/latex] на выражение под знаком произведения и увеличиваем [latex]count[/latex] на единицу.
Если разность меньше точности, число [latex]count[/latex] и будет количеством сомножителей в произведении.
Число сомножителей оказалось достаточно большим — 88390. Ideone
Работает правильно. Засчитываю, чтобы снова не проверять. Но….
— «Идея решение» либо через дефис, либо второе слово в родительном падеже.
— 6-ю строку лучше записать как в условии. Т.е. у Вас правильно, но читатель должен сообразить, что это. Или напишите комментарий.
— 7-я строка. Комментарий так и просится.
— Пояснения очень хорошие, но «превосходство точности» это неточное употребление слова. Может лучше «превышение погрешности»?
— Метки не очень удачные. «Погрешность, произведение, значащие цифры» — что-то такое нужно.
— Если не хотите писать комментарии то строки 6-8 лучше объединить и вставить в инициализатор 10-й? Как то привычнее будет, чем с пустым инициализатором в цикле. Но комментарий ценнее для понимания.
Исправил «идею решение», поправил некоторые фразы и дописал комментарий к коду. Надеюсь, вы когда-нибудь увидите этот ответ…
Почему, Вы сомневаетесь?