Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Задание с факториалами


Автор: WinterEP 28.2.2009, 22:05
Привет! Нужна помощь в решении задания. ^^
Цитата
Написать функцию "Факториал" и программу, которая использует эту функцию для вывода таблицы факториалов.

Есть некоторые наработки, возможно пригодятся при написании кода:
Код

 void main (void)
  {
    float number, rez;
    puts ("Input number");
    scanf ("%f", & number);
    rez=factorial (number);
  printf ("%f", rez);
    getch ();
  }

Код

 float factorial (float R)
  {
    if (R<=1) return 1;
    else
    { return (R*factorial (R-1)); }
  }

Не лишним была бы совместимость программы с Turbo C++ 3.0. Спасибо )

Автор: Dmi3ev 28.2.2009, 22:44
че-то не очень у тебя наработки)))
Цитата

 float factorial (float R)
  {
    if (R<=1) return 1;
    else
    { return (R*factorial (R-1)); }
  }

зачем тут плавающая точка, факториал вроде целый...
Цитата

 void main (void)
  {
    float number, rez;
    puts ("Input number");
    scanf ("%f", & number);
    rez=factorial (number);
  printf ("%f", rez);
    getch ();
  }

это тоже чудоштука
вот тебе подарок от меня
Код


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

int main()
{
    int start;
    int finish;
    printf("Enter start number: ");
    scanf("%d", &start);
    printf("Enter finish number: ");
    scanf("%d", &finish);
    printf("=========================================\n");
    printf("|        Number     |    Factorial      |\n");
    printf("=========================================\n");
    for (int i=start; i<=finish; i++)
    {
        printf("|");
        printf("%19d",i);
        printf("|");
        printf("%19d",fact(i));
        printf("|\n");
        
    }
    printf("=========================================\n");
    system("pause");
    return 0;
}

таблица строится от числа start до finish

Автор: Dmi3ev 1.3.2009, 00:00
исправил ошибочку

Автор: IoganeGambaPuti 1.3.2009, 00:13
Код


#include <iostream>
#include <vector>
unsigned long int fact(unsigned int _entr_num)
{
  if (_entr_num==0) return 1;
  else return _entr_num*fact(_entr_num-1);
}

using namespace std;

int main(void)
{
  vector<unsigned int> mass_nums;
  unsigned int entr_num;
  long int fact_entr_num;
  bool more=true; 
  
  ios_base::iostate old_state=cin.exceptions();
  cin.exceptions(ios_base::badbit|ios_base::failbit);

  std::cout<<"Please enters massive of numbers for creation a table of their factorials(any negative number or symbol for end of massive):";
    while(more){
      try
    {
      cin>>entr_num;
      mass_nums.push_back(entr_num);
    }  
      catch(ios_base::failure)
    {
      more=false;
      cin.clear();
      cin.ignore(1000,'\n');
    }
    }
  vector<unsigned int>::iterator it;
  for(it=mass_nums.begin();it!=mass_nums.end();it++)
    {
      cout<<"-------------------------------------------------------"<<endl;
      cout<<"Number="<<*it<<endl;
      try
    {
      fact_entr_num=fact(*it);
      cout<<"Factorial of number="<<fact_entr_num<<endl; 
      cout<<"-------------------------------------------------------"<<endl;
    }
      catch(...)
    {
      cerr<<"Bad number"<<endl; 
      cerr<<"-------------------------------------------------------"<<endl;
    }
    }
  cin.exceptions(old_state);
  return 0;
}



Вот ещё 
P. S. только защиты от дурака нет(для больших чисел)

Автор: WinterEP 1.3.2009, 00:40
Dmi3ev, поначалу я сам подправил cout, а cin не менял - все работало, но получалось что без последнего исправления расчет факториалов смещался на один элемент. Сейчас все вычисляется и выводится правильно. Только была заминка с задержкой экрана, вроде бы сам исправил. В итоге:
Код

# include <conio.h>
# include <stdio.h>
# include <iostream.h>
# include <math.h>
int fact (int n)
{
    if(n==1)
        return 1;
    else
        return (n*fact(n-1));
}
int main()
{
    int start;
    int finish;
    printf("Enter start number: ");
    scanf("%d", &start);
    printf("Enter finish number: ");
    scanf("%d", &finish);
    printf("=========================================\n");
    printf("|        Number     |    Factorial      |\n");
    printf("=========================================\n");
    for (int i=start; i<=finish; i++)
    {
        printf("|");
        printf("%19d",i);
        printf("|");
        printf("%19d",fact(i));
        printf("|\n");

    }
    printf("=========================================\n");
    // return 0;
    getch ();
}

Может только библиотека какая лишняя, а так все супер. Благодарю!
P.S. Наработки не мои, хотя сам лучше не придумал бы... ))

IoganeGambaPuti, моему компилятору код не понравился, может много специфики. Но все равно спасибо! )

Автор: Dmi3ev 1.3.2009, 00:51
Цитата

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

и, конечно же, ты просто смутил меня своими наработками надо 
Код

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

 у IoganeGambaPuti правильно, потому что факториал 0=1, а так получится, что не будет у 0 факториала, это нехорошо

Добавлено через 1 минуту и 7 секунд
и в конце пиши
Код

 getch ();
 return 0;
}

так оно вернее

Автор: WinterEP 1.3.2009, 01:02
Dmi3ev,  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)