Итак, последние 2 часа я потратил на это, 100 раз подправил код, но ничего не получил. Нет ошибок и предупреждений, но ответ неверен. Вот мой код:
#include <iostream>
using namespace std;
void main()
{
/***********Variable Declarations************/
double count = 1, totalValue = 0, it, x, z=1, powe = 1, y;
cout << "Iterations=";
cin >> it;
cout << "x=";
cin >> x;
/***************End User Input***************/
while (count <= it)
{
for (int i = 0; i < powe; i++) {
z *= (x - 1) / (x + 1);
}
y = (1 / powe)*z;
totalValue = totalValue + y;
powe = powe + 2;
count++;
}
cout << "The Result is:" << 2*totalValue << endl;
}
Я знаю, что это проблема логики (математики), но я не могу ее найти. Спасибо.
Изменить: нам не разрешено использовать любую другую библиотеку.
Вы забыли установить z
до 1 в каждой итерации вашего while
:
#include <iostream>
using namespace std;void main()
{
/***********Variable Declarations************/
double count = 1, totalValue = 0, it, x, z=1, powe = 1, y;
cout << "Iterations=";
cin >> it;
cout << "x=";
cin >> x;
/***************End User Input***************/while (count <= it)
{
for (int i = 0; i < powe; i++) {
z *= (x - 1) / (x + 1);
}
y = (1 / powe)*z;
totalValue = totalValue + y;
powe = powe + 2;
count++;
z = 1; //Without this line you will have very high powers
}
cout << "The Result is:" << 2*totalValue << endl;
}
РЕДАКТИРОВАТЬ:
Вы можете оптимизировать свой подход без необходимости постоянно вычислять мощность с нуля:
#include <iostream>
using namespace std;void main()
{
/***********Variable Declarations************/
double count = 1, totalValue = 0, it, x, z, powe = 1, y;
cout << "Iterations=";
cin >> it;
cout << "x=";
cin >> x;
z = (x + 1) / (x - 1); //We start from power -1, to make sure we get the right power in each iteration;
//Store step to not have to calculate it each time
double step = ((x - 1) * (x - 1)) / ((x + 1) * (x + 1));
/***************End User Input***************/while (count <= it)
{
z * = step;
y = (1 / powe)*z;
totalValue = totalValue + y;
powe = powe + 2;
count++;
//We no longer need to set z to 1, as the previous value becomes useful
}
cout << "The Result is:" << 2*totalValue << endl;
}
Ваш метод неэффективен, а реализация неверна.
Это неправильно, потому что ваш внутренний цикл для расчета 2N
сила сломлена Вам нужно сбросить z
1 каждый раз перед внутренним циклом.
Но не делайте этого, вам вообще не нужен внутренний цикл.
Для того, чтобы рассчитать N
член серии, вам не нужно рассчитывать 2N
-я сила того же старого числа с самого начала. Вы только что рассчитали 2N-2
Эта сила этого числа на предыдущем шаге. Используй это.