Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2009, 20:53   #1
BackSlash
Пользователь
 
Регистрация: 15.12.2009
Сообщений: 39
Сообщение Объясните алгоритм.(For)Простая задача

Собственно задача:
Дано натуральное число n. Нужно вычислить n сомножителей произведения
(2\1)*(2\3)*(4\3)*(4\5)*(6\5)*(6\7) ....

Я в программировании на си новичок
Как мне с помощью, циклов for решить задачу?

как я понял общий вид этого кошмара будет такой
(n/m)*(n/(m+2))*((n+2)/(m+2))*((n+2)/(m+4))*((n+4)/(m+4))...

Писать решение не нужно, просто объясните мне алгоритм.
Как? Цикл в цикле или как?И вот прибавление идет через шаг (т.е 2,2,затем 4,4, потом 6,6 итд), а если в for то там я могу прибавлять только к каждому шагу, а не через шаг...

Поподробней и пояснее пожалуйста, я тугой на это дело
BackSlash вне форума Ответить с цитированием
Старый 15.12.2009, 22:19   #2
Дырдин
Пользователь
 
Аватар для Дырдин
 
Регистрация: 26.09.2009
Сообщений: 81
По умолчанию

Может как-то так? :

Код:
double proizv = 1;
for (int i = 2; i < n+2;i*2)//счетчик чётных чисел(тот что сверху)
{
   for (int j = i - 1; j > i+1;j+2)//счетчик нечётных чисел(тот что снизу)
   {
      proizv = proizv*(i/j);
   }
}
Дырдин вне форума Ответить с цитированием
Старый 15.12.2009, 22:28   #3
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Думаю, можно обойтись одним циклом. Создаете две переменные n и m, на каждом шаге цикла если счетчик цикла четный (начинаем с нулевого значения), то увеличиваем n на 2, если нечетный - увеличиваем m. И вычисляем новую дробь из новых n и m, и будет это просто n/m. Произведение домножаем на эту новую дробь. Алгоритм, кажется, крайне простой. Ну и еще для ясности можно на самом первом шаге не увеличивать n, как-никак, это начальное значение, относительно чего увеличивать?
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 16.12.2009, 00:02   #4
BackSlash
Пользователь
 
Регистрация: 15.12.2009
Сообщений: 39
По умолчанию

Код:
#include "stdafx.h"


int main(void)
{
    int n,
        i=1;
    float s=1;
    printf("Vvedite n=");// Число повторений
    scanf_s ("%d",&n);
    for (i=1;i<=(n + n%2)/2;i++) // i<(n + n%2) это условие четности,
    s*=(i*(2.))/(i*2-1)*(i*2)/(i*(2.)+1);
    i--; // вернуть i которая была на последнем заходе
    if(n%2) s*=(i*(2.)+1)/(i*2);
    printf ("Otvet=%f",s);
    return 0;
}
вот как вариант

Последний раз редактировалось BackSlash; 16.12.2009 в 00:05.
BackSlash вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объясните алгоритм программы с рекурсией на паскале Lostsage Помощь студентам 4 20.01.2009 20:10
Не простая задача !!! MaxZoa Microsoft Office Excel 2 06.03.2008 18:07
Простая задача utyyf Помощь студентам 25 18.10.2007 14:50