@james curran: I was trying to solve the TMUL problem in spoj. I think
requires Karatsuba algorithm.  I'm sure that my algorithm is fine. But
i get runtime error SIGABRT. that's y i'm asking.



#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

using namespace std;

class bigint{
    public:
                   int len;
                   int *num;


               bigint(){
                       len=1;
                       num=new int[1];
                       num[0]=0;
               }
               bigint(int x){
                    num=new int[x];
                    len=x;
             }
               bigint(char *str){
                       int i;
                       len=strlen(str);
                       num=new int[len];

                       for(i=0;i<len;i++)
                               num[i]=((int)str[i])-48;
               }


               void clear(){
            int i,j;
            for(i=0;i<len && num[i]==0 ;i++);

            len-=i;
            for(j=0;j<len;j++)
               num[j]=num[j+i];
           if(len==0)
           {
                 len=1;
                 num[0]=0;
           }


       }
               bigint( bigint & copy){
                       int i;
                       len=copy.len;
                       num=new int[len];


                       for(i=0;i<len;i++)
                               num[i]=copy.num[i];
               }
               void operator =(bigint & another){
                       int i;
                       len=another.len;
                       free(num);
                       num=new int[len];


                       for(i=0;i<len;i++)
                               num[i]=another.num[i];

               }
               void operator = ( char *s){
            int i;
                   len=strlen(s);
           num=new int[len];

            for(i=0;i<len;i++)
                num[i]=(int)(s[i])-48;
        }

               void print(){
                       int i;
                       for(i=0;i<len;i++)
                               cout<<num[i];

               }



               char* operator + (bigint other){

              int swapped=0,carry=0,i,j,k,resultlength=
len>other.len? len+1 : other.len+1;
              bigint result(resultlength),temp(resultlength);
              k=result.len-1;

              //making the number having more length as the first
number
              if(len<other.len) {

                            swapped=1;
                            temp=(*this);
                            (*this)=other;
                            other=temp;
              }



              //adding until equal length

              for(i=len-1,j=other.len-1;j>=0;j--,i--,k--)
              {
                   result.num[k]=num[i]+other.num[j]+carry;
                   if(result.num[k]>9){
                       result.num[k]-=10;
                        carry=1;
                   }
                   else carry=0;

              }
              //remaining numbers in the first number...
              for(;i>=0;i--,k--){
                  result.num[k]=carry+num[i];
                  if(result.num[k]>9){
                           result.num[k]-=10;
                           carry=1;
                  }
                  else carry=0;
              }

              if(carry==0){
                 for(i=0;i<result.len-1;i++)
                        result.num[i]=result.num[i+1];
                 result.len--;

              }
              else
                    result.num[0]=1;

             // result.print(); cout<<endl;
              char * resultstring=new char[result.len+1];


              for(i=0;i<result.len;i++)
                        resultstring[i]=(char)(result.num[i]+48);
              resultstring[i]='\0';

              if(swapped==1){
                 bigint temp= (*this);
                 *this= other;
                 other= temp;
                 swapped=0;
               }

              return resultstring;
       }

void    operator * (bigint other){
                   bigint result(other.len+len);
                   int carry,l,i,j,k,tempnum;
                   char * resultstring;
                   bigint tempresults[other.len]; //declaring an

                   for(i=0;i<result.len;i++)
                     result.num[i]=0;

                   for(i=0;i<other.len;i++)  //finding all the
tempresults
                   {       carry=0;
                           tempnum=other.num[other.len-i-1];
//current multiplier
                           //cout<<"tempnum=" <<tempnum<<endl;
                           tempresults[i].len=len+i+1;
//allocating memory for tempbigints
                           tempresults[i].num=new
int[tempresults[i].len];
                           for(k=tempresults[i].len-1,l=len-1;
l>=0;k--){
                                     if(k>len)
                                     {
                                         tempresults[i].num[k]=0;
                                         continue;
                                     }
                                     else{

tempresults[i].num[k]=(tempnum*num[l--])+carry;
                                          if(tempresults[i].num[k]>9){
 
carry=tempresults[i].num[k]/10;
                                            //
cout<<"carry="<<carry<<endl;
                                              tempresults[i].num[k]
%=10;
                                          }
                                          else
                                             carry=0;

                                     }
                           }

                           if(carry==0){
                                        tempresults[i].len--;
                                         for(j=0;j<tempresults[i].len;j
++)

tempresults[i].num[j]=tempresults[i].num[j+1];


                           }
                           else
                                        tempresults[i].num[0]=carry;

                         //  tempresults[i].();


                   }

                   for(i=0;i<other.len;i++){
                         result=result+tempresults[i];
                       free(tempresults[i].num);
                   }

                   result.clear();
                  result.print();

                 // free(result.num);


       }

      // ~bigint(){free(num);}
};


char s1[10005],s2[10005];//=new char[2000],*s2=new char [2000];

int main(){
   int t;
   cin>>t;
   while(t--){
   fflush(NULL);
   cin>>s1>>s2;
  bigint A(s1), B(s2);
    A*B;

    cout<<endl;


}
          return 0;
}






-- 
You received this message because you are subscribed to the Google Groups 
"Algorithm Geeks" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/algogeeks?hl=en.

Reply via email to