Как на С написать программу, которая посчитает (1+1/1^2) * (1+1/2^2) * ... * (1+1/N^2)
?
3 ответа
Попробуйте так:
#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;
}
Что-нибудь типа такого:
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, где валяется функция степени, и есть ли *=
в С.
-
Это хорошо, что в отличии от @niks123123, Вы забыли о функции
pow()
. Правда, на всякий случай, я бы привел один из сомножителей в знаменателе к(long long)
(поскольку при int N уже при N = 65536 наступит переполнение).– avp31 окт 2014 в 22:18 -
-
1Это не страшно. Теперь будете вспоминать. Т.е. правильно написать temp *= 2.0 / ((long long)rownds * rownds); Операция
*=
, естественно, в Си есть. IMHO во все остальные языки эти операции (+=, *= ...) пришли из Си. -- А вот2 / (целое)
-- это неправильно. При целочисленном делении все члены, кроме round == 1 окажутся равными 0 (!).– avp31 окт 2014 в 22:39
А про рекурсию забыли?
double calculate(int extent)
{
if (extent<2) { // проверка на степень == 1 - выход из рекурсии
return 2;
}
return (1+1/(double)(extent*extent))*calculate(extent-1);
}
Вызов:
double result = calculate(5);