Факториал в Бигнумской библиотеке - PullRequest
2 голосов
/ 21 июня 2011

Я пытался создать свою собственную реализацию библиотеки bignum, которую я не могу заставить факториал работать.Если я попрошу его решить 4 !, он выдаст 96. Он умножит 4 в два раза.аналогично 5!это 600, а не 120. Я не реализовал деление, поэтому я не могу / не хочу делить ответ на число

//bignum project
#include <iostream>
using namespace std;

class bignum
{
      public:
      int number[100];
      int dpos;
      int operator/ (bignum);
      bignum operator- (bignum);
      bignum operator* (bignum);
      bignum operator+ (bignum);
      bignum operator= (string);     
      void output()
      {
           int begin=0;
           for(int i=0; i<=99; i++)
           {
                   if(number[i]!=0 || begin==1)
                   {
                                   cout<<number[i];
                                   begin=1;
                   }
           }
      }
};

bool num_is_zero(bignum k)
      {
           for(int a=0; a<=99; a++)
           {
                   if(k.number[a]!=0)
                   {
                                     return false;
                   }
           }
           return true;
      }

 bignum factorial(bignum a)
      {
             bignum j;
             bignum fact;
             fact="1";

             while(!num_is_zero(a))
             {
                                   j="1";
                                   fact=fact*a;
                                   a=a-j;                         
             }
             return fact;
      }

bignum bignum::operator= (string k)
{
       int l;
       l=k.length()-1;
       for(int h=0; h<=99; h++)
       {
                   number[h]=0;
       }
       for(int a=99; a>=0 && l>=0; a--)
       {
               number[a]=k[l]-'0';
               l--;
       }
}

bignum bignum::operator+ (bignum b) 
{
  bignum a;
  int carry=0;
  for(int k=0; k<=99; k++)
  {
                   a.number[k]=0;
  }
  for(int i=99; i>=0; i--)
  {
          a.number[i]= number[i]+b.number[i]+a.number[i];
          if(a.number[i]>9)
          {
                           carry=(a.number[i]/10);
                           a.number[i-1]+=carry;
                           a.number[i]=(a.number[i]%10);
          }

  }
  return (a);
}

bignum bignum::operator- (bignum c) 
{
  bignum a;
  int sign=0;
  for(int k=0; k<=99; k++)
  {
                   a.number[k]=0;
  }
  for(int i=99; i>=0; i--)
  {
          if(number[i]<c.number[i])
          {
                    number[i]+=10;
                    if(i!=0)
                    number[i-1]--;

          }
          a.number[i]=number[i]-c.number[i];
  }
  return (a);
}

bignum bignum::operator* (bignum b) 
{
  bignum ans;
  int ans_grid[100][100],x,lines=0,carry,sum[100];
  for(int a=0; a<=99; a++)
  {
          for(int b=0; b<=99; b++)
          {
                  ans_grid[a][b]=0;
          }
  }
  for(int i=99; i>=0; i--)
  {
          for(int j=i,x=99; j>=0; j--,x--)
          {       
                    ans_grid[lines][j]=(number[i]*b.number[x]);       
          } 
          lines++;        
  }

//------------------------------------------------Carry Forward and assign to ans------------------------------------------------//
  for(int j=99; j>=0; j--)
  {
          for(int i=99; i>=0; i--)
          {
                  if(ans_grid[j][i]>9 && i!=0)
                  {
                                      carry=(ans_grid[j][i]/10);
                                      ans_grid[j][i-1]+=carry;
                                      ans_grid[j][i]%=10;
                  }
          }
  } 
  for(int col=99; col>=0; col--)
  {
          for(int row=99; row>=0; row--)
          {
                  sum[col]+=ans_grid[row][col];
          }
  }
  for(int i=99; i>=0; i--)
          {
                  if(sum[i]>9 && i!=0)
                  {
                                      carry=(sum[i]/10);
                                      sum[i-1]+=carry;
                                      sum[i]%=10;
                  }
          }
  for(int l=0; l<=99; l++)
  ans.number[l]=sum[l];
//-------------------------------------------------------------------------------------------------------------------------------//
  return (ans);
}

1 Ответ

2 голосов
/ 21 июня 2011

Я думаю, что ваша проблема в том, что sum неинициализирован в вашем operator*.Я не хочу давать частичный ответ, так как я взял код и немного поиграл с ним, так что вот моя версия, которая работает (и также выводит «0» правильно):

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

...