0

Как на С написать программу, которая посчитает (1+1/1^2) * (1+1/2^2) * ... * (1+1/N^2)?

1
  • @ffbarney, Если вам дан исчерпывающий ответ, отметьте его как верный (нажмите на галку рядом с выбранным ответом). 31 окт 2014 в 19:09

3 ответа 3

1

Попробуйте так:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, char *argv[])
{
  int N = 5; // Ваше N
  int i; // Counter
  double Final = 1; // Искомое число. Почему 1? Потому что будем умножать. Умножим на 0 - будет ноль.
  for ( i = 0; i < N; i++ )
      {
          double PowValue = pow ( i + 1, 2 );
          double Value = ( 2 / PowValue ); // Саму исходную формулу можно чуть-чуть поменять
          Final *= Value;
      }
  printf ("%f\n\r", Final );    
  return 0;
}
0

Что-нибудь типа такого:

double calculation(int rounds) {
    if (rounds <= 0) {
        return 0;
    }
    double temp = 1;
    while (rounds > 0) {
        temp = temp * (1 + 1 / (rounds * rounds));
        rounds--;
    }
    return temp;
}

И не кричите меня, я не помню, как правильно осуществлять декремент в while, где валяется функция степени, и есть ли *= в С.

3
  • Это хорошо, что в отличии от @niks123123, Вы забыли о функции pow(). Правда, на всякий случай, я бы привел один из сомножителей в знаменателе к (long long) (поскольку при int N уже при N = 65536 наступит переполнение).
    – avp
    31 окт 2014 в 22:18
  • @avp, если честно, я вообще не задумывался о переполнении, когда писал.
    – etki
    31 окт 2014 в 22:26
  • 1
    Это не страшно. Теперь будете вспоминать. Т.е. правильно написать temp *= 2.0 / ((long long)rownds * rownds); Операция *=, естественно, в Си есть. IMHO во все остальные языки эти операции (+=, *= ...) пришли из Си. -- А вот 2 / (целое) -- это неправильно. При целочисленном делении все члены, кроме round == 1 окажутся равными 0 (!).
    – avp
    31 окт 2014 в 22:39
0

А про рекурсию забыли?

double calculate(int extent)
{
    if (extent<2) { // проверка на степень == 1 - выход из рекурсии
        return 2;   
    }
    return (1+1/(double)(extent*extent))*calculate(extent-1);
}

Вызов:

double result = calculate(5);

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.