Другие языки программирования и технологии

Чётные и нечётные числа

Как в с++ записать можно такое 1/2+1*3/2*4+1*3*5/2*4*6 +..и т д пока истинно условие. то есть с каждым шагом в числителе добавляется очередной нечетный множитель а в знаменателе очередной четный множитель и всё это суммируется с предыдущими шагами.
С++ плохо знаю, напишу примерно, а алгоритм такой
S = 0;
a = 1;
i = 1;
do while a > 0 // цикл до тех пор, пока прибавляемая дробь не станет равна машинному нулю
{
a = a*i/(i+1); // очередная дробь. Числитель умножается на нечетное, знаменатель на четное.
S += a; // сумма дробей
i += 2; // шаг равен 2
}
printf (S)
return 0

Мы умножаем числа до тех пор, пока очередная дробь не превратится в машинный 0, после чего складывать нули становится бессмысленно. Но это происходит очень медленно. На дроби 15/16,
то есть (1*3*...*15)/(2*4*...*16) число становится меньше 0,2; на дроби 63/64 меньше 0,1, и т. д.
ВР
Владимир Райков
53 127
Лучший ответ
Константин Тебеньков А это разве не получиться 1/2+3/4+5/6... если S += a?
x := 1.0 / 2
Sum := x
ЦИКЛ i := 3 шагом 2 до (условие)
x := x * i / (i + 1)
Sum := Sum + x
КОНЕЦ ЦИКЛА
Для нечётных чисел есть формула:
O = 2*k + 1 (k -натуральные числа)
Для чётных чисел:
E = 2*k

Но так как тут очередной множитель основан на предыдущем, то часть, которая будет использоваться далее надо сохранять и передавать между итерациями

Вот как-то так:
double tmp = 1;
double S = 0;
int i = 0;
while(tmp>1e-12) // до определённой величины, иначе будет вечный цикл
{
tmp = tmp * (2*i+1) / (2*(i+1)); // очередной член получаем, добавляя число в числитель и знаменатель
S += tmp;
i++;
}

//
//i=0: tmp = 1*(1)/(2)
//i=1: tmp = 1*(1)*(3)/((2)*(4))
// и т. д.

Похожие вопросы