算法——大整数乘法

C++语言实现大整数乘法

list<char> long_sub(list<char> a,list<char>b);
list<char> long_add(list<char> a,list<char>b)
{
      list<char> c;
      if(*(a.begin())=='-' && *(b.begin())!='-')
      { a.erase(a.begin());//去掉符号位
            c=long_sub(b,a);
            return c;  
      }
       if(*(a.begin())!='-' && *(b.begin())=='-')
      { b.erase(b.begin());//去掉符号位
            c=long_sub(a,b);
            return c; 
       }
      if(*(a.begin())=='-' && *(b.begin())=='-')
      { a.erase(a.begin());//去掉符号位
            b.erase(b.begin());
            c=long_sub(a,b);
            c.push_front('-');
            return c; 
      }
    if(*(a.begin())!='-' && *(b.begin())!='-')
    {//保证两个数字位数相同
          int len1=a.size();int len2=b.size();
          if(len1for(int i=0;i'0');
          else
                if(len1>len2)
                      for(int i=0;i'0');
    //两个位数相同的正整数相加;
    int carry=0;//进位
    int num;
    list<char>::iterator iter1=a.end();  iter1--;
    list<char>::iterator iter2=b.end(); iter2--;
    for(;iter1!=a.begin() && iter2!=b.begin();iter1--,iter2--)
    {     int num1=*iter1-'0';int num2=*iter2-'0';
          num=(num1+num2+carry)%10;
          carry=(num1+num2+carry)/10;
          c.push_front(num+'0');
    }
    //最高位相加的处理
    int num1=*iter1-'0';int num2=*iter2-'0';
    num=(num1+num2+carry)%10;
    carry=(num1+num2+carry)/10;
    c.push_front(num+'0');
    if(carry!=0)
          c.push_front('0');
    return c;
    }
    return c;
}
list<char> long_sub(list<char> a,list<char>b)
{//a-b
      list<char> c;
      if(*(a.begin())!='-' && *(b.begin())=='-')
      { b.erase(b.begin());//去掉符号位
            c=long_add(a,b);
            return c;
      }
      if(*(a.begin())=='-' && *(b.begin())!='-')
      {    a.erase(a.begin());
            c=long_add(a,b);
            c.push_front('-');
            return c;
      }
      if(*(a.begin())=='-'&&*(b.begin())=='-')
      { a.erase(a.begin());b.erase(b.begin());
            c=long_sub(b,a);
            return c;
      }
      if(*(a.begin())!='-' && *(b.begin())!='-')
      { int sign=-1;//结果的正负
            int len1=a.size();   int len2=b.size();
            if(len1'-';
                  for(int i=0;i'0');
            }
            else
                  if(len1>len2)
                    for(int i=0;i'0');
                  else
                        if(*(a.begin())<*(b.begin()))
                              sign='-';
            int cc=0;//借位
            int num;
            list<char>::iterator iter1=a.end(); iter1--;
            list<char>::iterator iter2=b.end(); iter2--;
            if(sign!='-')
            {    for(;iter1!=a.begin() && iter2!=b.begin();iter1--,iter2--)
                  {
                        int num1=*iter1-'0';int num2=*iter2-'0';
                        int c_new=0;
                        if(num1-cc1;
                              num1=num1+10;
                        }
                        num=(num1-num2-cc)%10;
                        cc=c_new;
                        c.push_front(num+'0');
                  }
                  //最高位的处理
                  int num1=*iter1-'0'; int num2=*iter2-'0';
                  num=(num1-num2-cc)%10;
                  if(num!=0)
                        c.push_front(num+'0');
            }
            else
                  if(sign='-')
                  { for(;iter1!=a.begin() && iter2!=b.begin();iter1--,iter2--)
                        {
                              int  num1=*iter1-'0'; int num2=*iter2-'0';
                              int c_new=0;
                              if(num2-cc1;
                                    num2=num2+10;
                              }
                              num=(num2-num1-cc)%10;
                              cc=c_new;
                              c.push_front(num+'0');
                        }
                        //最高位的处理
                        int num1=*iter1-'0'; int num2=*iter2-'0';
                        num=(num2-num1-cc)%10;
                        if(num!=0)
                              c.push_front(num+'0');
                        c.push_front('-');
                  }
                  return c;
      }
      return c;
}
void MultiPly()//大整数乘法;
{//循环法计算,float类型正负号问题都可以间接转换成正整数相乘问题;
      char s1[1000],s2[1000];
      cout<<"输入两个大整数"<cin>>s1>>s2;
      int i=0,j=0;
      bool flag=false;
      int len1=strlen(s1);
      int len2=strlen(s2);
      int len=len1*len2+1;
      int *a=new int [len1];
      int *b=new int [len2];
      int *c=new int [len];
      for( i=0;i0;
      for(i=0;i1-i)-'0';
       for(i=0;i1-i]-'0';
       for(i=0;ifor(j=0;jfor(i=0;iif(c[i]>9)
             {
                   c[i+1]+=c[i]/10;
                   c[i]%=10;
             }
       }
       cout<<"两个大数相乘结果如下:"<for(i=len-1;i>=0;i--)
       {
             if(flag)
                   cout<else
             {
                   if(c[i]!=0)
                        { cout<true;}
             }
       }
       delete[]a;delete[]b;delete[]c;
}


你可能感兴趣的:(算法)