Расчет суммы с помощью C ++ - PullRequest
2 голосов
/ 04 февраля 2012

Я написал следующий код для суммирования серии (-1)^i*(i/(i+1)).Но когда я запускаю его, я получаю -1 для любого значения n.

Может кто-нибудь указать, что я делаю неправильно?Заранее спасибо!

#include <iostream>
using namespace std;

int main()
{
    int sum = 0;
    int i = 1.0;
    int n = 5.0;

    for(i=1;i<=n;i++)
        sum = (-1)^i*(i/(i+1));

    cout << "Sum" <<" = "<< sum << endl;
    return 0;
}

Ответы [ 7 ]

14 голосов
/ 04 февраля 2012

Задача № 1: Оператор C ++ ^ не является математическим оператором степени. Это побитовый XOR.

Вы должны использовать pow() вместо.

Задача № 2: Вы храните типы с плавающей точкой в ​​целочисленном типе. Таким образом, следующее приведет к целочисленное деление (усеченное деление) :

i/(i+1)

Задача № 3: Вы на самом деле ничего не суммируете:

sum = ...

должно быть:

sum += ...

Исправленная версия кода выглядит следующим образом:

double sum = 0;
int i = 1;
int n = 5;

for(i = 1; i <= n; i++)
    sum += pow(-1.,(double)i) * ((double)i / (i + 1));

Хотя вам действительно не нужно использовать pow в этом случае. Подойдет простой тест на нечетность / четность.

double sum = 0;
int i = 1;
int n = 5;

for(i = 1; i <= n; i++){
    double val = (double)i / (i + 1);
    if (i % 2 != 0){
        val *= -1.;
    }
    sum += val;
}
4 голосов
/ 04 февраля 2012

Вам нужно также положить сумму + = pow (-1, i) * (i / (i + 1));

В противном случае вы теряете предыдущий результат каждый раз.

Используйте powфункция для операции pow.

edit: как сказано в другом посте, используйте double или float вместо int, чтобы избежать усеченного деления.

3 голосов
/ 04 февраля 2012

Как насчет этого

((i % 2) == 0 ? 1 : -1)

вместо

std::pow(-1, i)

?

Полный ответ:

double sum = 0;
int i = 1.0;
int n = 5.0;
for (i = 1; i <= n; ++i) {
    signed char sign = ((i % 2) == 0 ? 1 : -1);
    sum += sign * (i / (i+1));
}
2 голосов
/ 04 февраля 2012

У вас, кажется, есть несколько ошибок в вашем коде:

using namespace std;

Это не имеет прямого отношения к вашей проблеме, но никогда не говорите using namespace std; Это вносит незначительные ошибки.

int i = 1.0;
int n = 5.0;

Вы инициализируете интегральные переменные с константами с плавающей точкой.Попробуйте

int i = 1;
int n = 5;


sum = (-1)^i*(i/(i+1));

У вас есть две проблемы с этим выражением.Во-первых, количество (i/(i+1)) всегда равно нулю.Помните, что нужно разделить два int раунда на результат.Во-вторых, ^ не делает то, что вы думаете, что делает.Это оператор исключительности или оператора, а не оператор возведения в степень.В-третьих, ^ связывается менее плотно, чем *, поэтому ваше выражение:

-1 xor (i * (i/(i+1)))

-1 xor (i * 0)
-1 xor 0
-1
2 голосов
/ 04 февраля 2012

Мало проблем:

  1. ^ является битовым исключением или в c ++ не "возведен в власть". Используйте метод pow ().

  2. Снять висячую скобу открытия с последней строки

  3. Используйте целые, не плавающие при назначении.

1 голос
/ 04 февраля 2012

Есть несколько проблем с кодом:

int sum = 0;

Промежуточные результаты не являются целыми числами, это должно быть двойное значение

int i = 1.0;

Поскольку вы будете использовать это в делении, оно должно быть двойным, 1/2 равно 0, если рассчитано в целых числах.

int n = 5.0;

Это целое число, а не значение с плавающей запятой, нет нуля 0.

    for(i=1;i<=n;i++)

Вы уже инициализировали i для 1, зачем это снова?

sum = (-1)^i*(i/(i+1));

На каждой итерации вы теряете предыдущее значение, вы должны использовать sum + = 'new values'

Кроме того, вам не нужен pow для вычисления (-1)^i, все, что он делает, это переключается между +1 и -1 в зависимости от нечетного / четного состояния i. Вы можете сделать это проще с помощью оператора if или с 2 for, один для нечетных i, один для четных ... На самом деле много вариантов.

1 голос
/ 04 февраля 2012

^ не делает то, что вы думаете, что делает.Также в вашем коде есть некоторые другие ошибки.

Что это должно быть:

#include <iostream>
#include <cmath>

int main( )
{
    long sum = 0;
    int i = 1;
    int n = 5;

    for( i = 1; i <= n; i++ )
        sum += std::pow( -1.f, i ) * ( i / ( i + 1 ) );

    std::cout << "Sum = " << sum << std::endl;

    return 0;
}

Чтобы получить степень значения, используйте std::pow ( см. Здесь ).Также вы не можете присвоить int десятичному значению.Для этого вам нужно использовать float или double.

Вышеупомянутый ^ является бит-XOR, а не знаком для показателя степени.

Также будьте осторожны с Целочисленная арифметика , как вы можете получить неожиданные результаты.Скорее всего, вы хотите изменить ваши переменные на float или double.

...