1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

Calculating Factorial (Recursively & Iteratively)

Discussion in 'C' started by pradeep, Oct 30, 2006.

  1. pr1nc3k1d

    pr1nc3k1d New Member

    Joined:
    Dec 6, 2007
    Messages:
    11
    Likes Received:
    0
    Trophy Points:
    0
    Occupation:
    Student
    Location:
    Romania
    Did you try the code ? It's working fine ( no overflow ) but it's also limited. I didn't say that it's not. I wanted to write a code which calculates the factorial of 1000 but it's also working for greater values. The vector can hold a result with more than 10.000 digits , but it's limited.
     
  2. asadullah.ansari

    asadullah.ansari TechCake

    Joined:
    Jan 9, 2008
    Messages:
    356
    Likes Received:
    14
    Trophy Points:
    0
    Occupation:
    Developer
    Location:
    NOIDA


    First i told you to store in vector too much overhead and second thing storing has some limit!!! But you know today In Statistical Software factorial of very big number is required. So on that case, By any way you have to go for sterling Approximation formula.
     
  3. asadullah.ansari

    asadullah.ansari TechCake

    Joined:
    Jan 9, 2008
    Messages:
    356
    Likes Received:
    14
    Trophy Points:
    0
    Occupation:
    Developer
    Location:
    NOIDA
    I got the solution for any Big number!!! This code is very efficient and optimized implemented by limked list..
    Code:
    class Link
    {
    //Data Member Parts
    private:
     int dta;
     Link *nxt;
     Link *prv;
     Link *hd;
     Link *rear;
    
    // Function Member Parts
    
    public:
     Link(const int& tmp)  :dta(tmp),hd(NULL),rear(NULL),prv(NULL),nxt(NULL)
    {
              ;
    }
     Link* NxtLnk()   //getting next node
    {
        return nxt;
    }
    
     Link* PrvLnk()  //getting previous node
    {
      return prv;
    }
     void ExtraInsert(Link* p);          // After Inserting
     int getDta(void)
    {
       return dta;
    }
     void SetDta(int temp)
    {
       dta = temp;
    }
     int GetNoOfElem();
     Link* ToHead();
     Link* ToRear();
     void DeleteMe(void);
     void ClearAll(void);
    };
    
    
    int Link::GetNoOfElem()
    {
     int count = 0;
     Link* p =ToHead();
    
     while(p->NxtLnk()!=NULL){
      count++;
      p = p->NxtLnk();
     }
    
     count++;
     return count;
    }
    
    void Link::ExtraInsert(Link* p)
    {
     //    Link* p;
     if(prv == NULL) { hd = this;}
     p->nxt = nxt;
     p->prv = this;
     nxt = p;
     if(p->nxt == NULL){rear = p;}
    };
    
    
    
    Link* Link::ToHead()
    {
     if(hd == this){ //this is the first node
      return this;
     }
    
     Link *p = this;
     while(p->prv != NULL){
      p = p->prv;
     }
    
     return p;
    }
    
    Link* Link::ToRear()
    {
     if(rear == this){
      return this;
     }
    
     Link *p = this;
     while(p->nxt != NULL){
      p = p->nxt;
     }
    
     return p;
    }
    
    
    
    //***** Start ************//
    void Link::DeleteMe(void)
    {
     if(prv == NULL) // First Element
    {
      nxt->prv = NULL;
      hd = nxt;  // Next will be first one
      delete this;
      return;
     }
     if(nxt == NULL)
    {
      prv->nxt = NULL; // last node
      rear = prv; //Previous node will be first
      return;
     }
     prv->nxt = nxt;
     delete this;
    }
    //****  End Of Function*******//
    
    void Link::ClearAll(void)
    {
     Link* p1 = ToHead();
     Link* p2;
     while(p1->NxtLnk() != NULL){
      p2 = p1;
      p1 = p1->NxtLnk();
      delete p2;
     }
     delete p1;
    };
    
    
    int main()
    {
     int n;// remainder
     int cy  // Carried over
     int rst;
     int N;
     Link* p = new Link(1);
    
     cout<<"Plz input the number:";
     cin>>N;
     for(int n=1;n<=N;n++)
     {
      rn = carry = 0;
      p = p->ToHead();
    
      while(p->NxtLnk() != NULL)
    {
       rst = p->getDta()*n+cy
       if(rst>=10){
        rn = rst%10;
        carry = rst/10;
        p->SetDta(rn);
       }
       else
      {
          p->SetDta(rst);
      }
      p = p->NxtLnk();
      carry = rst/10;
      }
      rst = p->getDta()*n+cy
    
    
    //Other allocated memory for carried over
      while(rst >= 10){
       Link * newLink = new Link(0);
       p->SetDta(rst%10);//rnder
       rst = rst/10;
       p->ExtraInsert(newLink);
       p = p->NxtLnk();
      }
      p->SetDta(rst);
     }
    
     p = p->ToRear();
     while(p->PrvLnk()!=NULL)
    {
      cout<<p->GetDta();
      p=p->PrvLnk();
     }
     cout<<p->GetDta()<<endl;
     int num = p->GetNoOfElem();
     if(num >=5)
    {
      p = p->ToRear();
      cout<<endl<<"Or"<<endl<<endl;
    
      cout<<p->GetDta()<<".";
      p = p->PrvLnk();
    
     for(int i=1;i<5;i++)
    {
       cout<<p->GetDta();
       p = p->PrvLnk();
      }
      cout<<"E"<num-1<endl;
     }
     p->ClearAll();
     return 0;
    }
     
    Last edited by a moderator: Jan 15, 2008
  4. shabbir

    shabbir Administrator Staff Member

    Joined:
    Jul 12, 2004
    Messages:
    15,283
    Likes Received:
    364
    Trophy Points:
    83
    asadullah.ansari, Learn to use Code block when you have code snippets in posts
     
  5. pr1nc3k1d

    pr1nc3k1d New Member

    Joined:
    Dec 6, 2007
    Messages:
    11
    Likes Received:
    0
    Trophy Points:
    0
    Occupation:
    Student
    Location:
    Romania

    Is this code working cuz I tried it and it's not !?
     
  6. asadullah.ansari

    asadullah.ansari TechCake

    Joined:
    Jan 9, 2008
    Messages:
    356
    Likes Received:
    14
    Trophy Points:
    0
    Occupation:
    Developer
    Location:
    NOIDA
    Yes!!! It's working. which plateform you r trying...
     
  7. vignesh_sv

    vignesh_sv New Member

    Joined:
    Jan 21, 2008
    Messages:
    9
    Likes Received:
    0
    Trophy Points:
    0
    very good job buddy could u help me by saying which is the header file to b included for using
    the command sleep( ); in c
     
  8. debleena_doll2002

    debleena_doll2002 New Member

    Joined:
    Feb 5, 2008
    Messages:
    119
    Likes Received:
    0
    Trophy Points:
    0
    Why tou are asking this question in this thread. Just create new thread for it in Queries
     
  9. lead.smart34

    lead.smart34 New Member

    Joined:
    Feb 14, 2008
    Messages:
    77
    Likes Received:
    0
    Trophy Points:
    0
  10. crazytolearn57

    crazytolearn57 New Member

    Joined:
    Feb 14, 2008
    Messages:
    48
    Likes Received:
    0
    Trophy Points:
    0
  11. aisha.ansari84

    aisha.ansari84 New Member

    Joined:
    Feb 13, 2008
    Messages:
    82
    Likes Received:
    1
    Trophy Points:
    0
    it takes a lot of time for large numbers
     

Share This Page