Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Описание функции, Определить ф-цию , вычисл. факториал. 
:(
    Опции темы
Tsunameh
Дата 9.5.2007, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 29.4.2007

Репутация: нет
Всего: нет



Доброго времени суток ! 
Возникла вот такая задачка ; просьба написать код таким образом , чтобы можно было разобраться самостоятельно с книжкой ) тоесть наиболее простая запись , просто чтобы работало )

Итак:

Описать функцию 

F(n,m) = (n!*m!)/(n*m)!  ,  n,m >=0. 

При этом необходимо определить функцию , вычисляющую факториал. 




Заранее спасибо )
PM MAIL   Вверх
zkv
Дата 9.5.2007, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 21
Всего: 92



Код

unsigned long  Fuct( unsigned long  n )
{
    if( n < 0 )
        ;//ошибка в данных надо как то предупредить и что то сделать
    unsigned long ulRet = 1;//0! == 1 по определению
    for( int i = 2; i <= n; ++i )
        ulRet *= i;
    return ulRet;
}

unsigned long  F( unsigned long  n, unsigned long  m )
{
    if( n < 0 || m < 0 )
        ;//ошибка в данных надо как то предупредить и что то сделать
    
    return (Fuct( n ) * Fuct( m )) / Fuct(m*n);//Внимание! Деление целочисленное!
}


Это сообщение отредактировал(а) zkv - 9.5.2007, 12:30
PM MAIL   Вверх
GIK
Дата 9.5.2007, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 4
Всего: 14



Цитата

При этом необходимо определить функцию , вычисляющую факториал. 

В смысе она отдельна должна быть? Ну короче вот пока, если надо переделаю smile
Код

#include<conio.h>
#include<iostream.h>
#include<stdlib.h>
#include<cstdlib.h>
#include<stdio.h>
#include<cstdio.h>

int F(const int n, const int m){
  int i, ran=1, ran2=1, ran3=1;
  //Âû÷èñëÿåì ôàêòîðèàë n
  for(i=2; i<=n; i++)
   ran*=i;
  for(i=2; i<=m; i++)
   ran2*=i;
  //Âû÷èñëÿåì ôàêòîðèàë n*m
  for(i=2; i<=(n*m); i++)
   ran3*=i;

  i=(ran*ran2)/ran3;
  return i;
}
int main(int argc, char* argv[])
{
 int n=1, m=2;
 printf("%d", F(n,m));

  //F(n,m) = (n!*m!)/(n*m)!  ,  n,m >=0.

    getch();
        return 0;
}


Добавлено через 1 минуту и 22 секунды
Упс, опоздал, решение уже есть smile


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
keenara
Дата 9.5.2007, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 2.2.2007

Репутация: 2
Всего: 2



Позволю себе несколько замечаний (zkv заранее сорри).
1)Не вижу никакого смысла в двойной проверке корректности: если что-то не так, то внутренняя функция Fuct все равно скажет об ошибке и еще и передаст наружу сигнал сбоя.
2)unsigned и т.п. могут показаться сложными, а автор просил
Цитата
написать код таким образом , чтобы можно было разобраться самостоятельно с книжкой

3)Факториал - по опредлению рекурсивная процедура, поэтому вычислять ее при помощи рекурсии сам Джа велел.

Поэтому предлагаю свой, более простой вариант.
Код

#include <iostream.h>
long Fuct(int n);
long F(int n, int m);
int main(){
int i;
cout<<"Введите число"; cin>>i;
cout<<F(i)<<endl;
return 0;
}

long Fuct(int n)
{
    if( n < 0 ){cout<<"Некорректное значение аргумента"<<endl; return 0;}
    if(n==0) return 1;
    else return n * Fuct(n-1);
}

long  F(int n, int m)
{
        return (Fuct( n ) * Fuct( m )) / Fuct(m*n);
}

PM MAIL   Вверх
GIK
Дата 9.5.2007, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 4
Всего: 14



Цитата

поэтому вычислять ее при помощи рекурсии сам Джа велел.

Согласен с Вами, а кто такой Джа, простите?  smile 


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Tsunameh
Дата 9.5.2007, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 29.4.2007

Репутация: нет
Всего: нет



Спасибо огромное и бальшущий вам риспект ) приду еще ))
PM MAIL   Вверх
keenara
Дата 9.5.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 2.2.2007

Репутация: 2
Всего: 2



Захады дарагой! мы тут как раз на ваших задачках прокачиваемся  smile 
PM MAIL   Вверх
zkv
Дата 9.5.2007, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 21
Всего: 92



Цитата(keenara @  9.5.2007,  12:48 Найти цитируемый пост)
1)Не вижу никакого смысла в двойной проверке корректности: если что-то не так, то внутренняя функция Fuct все равно скажет об ошибке и еще и передаст наружу сигнал сбоя.

Уважаемый(ая) keenara, не стояло задачи написать программу, была задача написать отдельные функции, вы уверены, что она нигде больше не будет вызываться? 
Даже если не будет, лишняя проверка никогда еще никому не помешала smile
Цитата(keenara @  9.5.2007,  12:48 Найти цитируемый пост)
2)unsigned и т.п. могут показаться сложными, а автор просил

не буду спорить, сужу по себе, я бы не испугался smile
Цитата(keenara @  9.5.2007,  12:48 Найти цитируемый пост)
3)Факториал - по опредлению рекурсивная процедура, поэтому вычислять ее при помощи рекурсии сам Джа велел.

не спорю, рекурсия хорошо смотрится, да и повозиться с ней иногда интересно из спортивного интереса, но по возможности следует ее избегать (стек не резиновый smile )
PM MAIL   Вверх
keenara
Дата 9.5.2007, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 2.2.2007

Репутация: 2
Всего: 2



Цитата
не стояло задачи написать программу, была задача написать отдельные функции

Некоторые особо одаренные товарищи из числа авторов тем в этом разделе не в состоянии собрать прогу из готовых функций smile . Я конечно понимаю что с методологической точки зрения вредно думать за них, но помочь тоже хочецца
Цитата
вы уверены, что она нигде больше не будет вызываться?

В любом случае если косячок с  аргументом будет то функция самого факториала нас все равно носом в это дело тыкнет
Цитата
лишняя проверка никогда еще никому не помешала smile

Ну если смотреть с философской точки зрения... усложнение кода, падение производительности, а главное - лишний геморрой при вычерчивании блок-схемы  smile 
Цитата
я бы не испугался

я тоже, но многие писаются при виде этих "страшных" слов  smile 
Цитата
но по возможности следует ее избегать (стек не резиновый smile )

Это что же такое туда надо засунуть чтобы стек переполнить?  smile 

Это сообщение отредактировал(а) keenara - 9.5.2007, 14:14
PM MAIL   Вверх
zkv
Дата 9.5.2007, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 21
Всего: 92



keenara, есть некоторые принципы, которых я придерживаюсь (по возможности не применять рекурсию, проверять ошибки где только можно - производительность перетопчется, особенно в таком контексте smile ), никому навязывать их я не собираюсь. Я сказал свое слово. smile
PM MAIL   Вверх
keenara
Дата 9.5.2007, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 2.2.2007

Репутация: 2
Всего: 2



Цитата
есть некоторые принципы, которых я придерживаюсь

Очень правильные принципы на самом деле, я тоже в СЕРЬЕЗНЫХ задачах их придерживаюсь, но в данном контексте... 
Ты пойми, я ж не из принципа все это говорю, а из сочуствия к кренделям которым все это дело придется защищать злобным преподам  smile 
Цитата
проверять ошибки где только можно

Гы, тогда по логике нужно еще и добавить проверку корректности ввода в том плане чтобы туда буквы не вводили smile . А что, шутки шутками, а наш препод при тестировании наших "шедевров" типа этого обожал вводить куда ни попадя фразу "11 попка дурак", после чего прогу отправляли на доработку, потому что она в лучшем случае выдавала лажу а в худшем - вешала всю среду разработки  smile 

Это сообщение отредактировал(а) keenara - 9.5.2007, 14:33
PM MAIL   Вверх
Rockie
Дата 9.5.2007, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 13
Всего: 31



Цитата(keenara @  9.5.2007,  12:48 Найти цитируемый пост)
Поэтому предлагаю свой, более простой вариант.

smile
Код

#include <iostream>    

int fact(int n)
{
    if(n==0) return 1;
    else return n*fact(n-1);
}

int main()    
{
    std::cout<<fact(5);

    return 0;    
}


Добавлено через 3 минуты и 58 секунд
еще на wiki:
Код
       int factorial(int x) {
         return (x == 0)?(1):(x * factorial(x - 1));
       }





--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
keenara
Дата 9.5.2007, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 2.2.2007

Репутация: 2
Всего: 2



Хе, я тоже тернарный оператор люблю, он красивый и почему-то в основном программерами незаслуженно забыт  smile 
PM MAIL   Вверх
GIK
Дата 10.5.2007, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 4
Всего: 14



Если уж говорить о загружанности компа, и о прочих подобных вещах, то ему  можно немого помочь:
Код

int factorial(int x) {
         return (x == 1)?(3):(x * factorial(x - 1));
     }



--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
zkv
Дата 10.5.2007, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 21
Всего: 92



Цитата(GIK @  10.5.2007,  13:01 Найти цитируемый пост)
int factorial(int x) {
         return (x == 1)?(3):(x * factorial(x - 1));
     }

не перемудрил? smile что делает эта функция?
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0896 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.