天天看点

高精度加减乘模版

#include <iostream>

#include <cstring>

#include <cstdio>

#include <algorithm>

#include <iterator>

using namespace std;

int compare(string str1, string str2)

{

  while(str1[0]=='0')

    {

      str1.erase(0,1);///删除str1[0]

    }

  while(str2[0]=='0')

    {

      str2.erase(0,1);

    }

  if(str1.size() > str2.size()) ///长度长的整数大于长度小的整数

    return 1;

  else if(str1.size() < str2.size())

    return -1;

  else

    return str1.compare(str2);

  ///若长度相等,从头到尾按位比较,

  ///compare函数:相等返回0,大于返回1,小于返回-1

}

int to_int(char ch)

  {

    return ch-48;

  }

char to_char(int i)

  {

    return (char)(i+48);

  }

void dipose_head(string& str,int sign)    ///str为引用类型

  {

    str.erase(0, str.find_first_not_of('0'));

    ///去除结果中的前导0

    if(str.empty()) str = "0";

    if((sign == -1) && (str[0] != '0'))

    ///处理符号位 ,若str[0] == '0'说明结果是0,就不必要在前面加上-

      str = '-' + str;

  }

///高精度加法

string ADD_INT(string str1, string str2)

///计算str1 + str2的值,处理成 str1 ,str2 >= 0

{

///要事先声明MINUS_INT

  string str;

///str1 ,str2 >= 0的情况

  string::size_type l1, l2;

  int i;

  l1 = str1.size();

  l2 = str2.size();

  if(l1 < l2)

///把两个整数对齐,短整数前面加0补齐

    for(i = 1; i <= l2 - l1; i++)

      str1 = '0' + str1;

  else

    for(i = 1; i <= l1 - l2; i++)

      str2 = '0' + str2;

  int int1 = 0, int2 = 0;

  ///int2 记录进位

  for(i = str1.size() - 1; i >= 0; i--)

   {

        int1 = ( str1[i]+str2[i] -  96  + int2 ) % 10;

        int2 = ( str1[i]+str2[i] -  96  + int2 ) / 10;

        str = to_char(int1) + str;

      }

  if(int2 != 0) str = to_char(int2) + str;

 ///处理最后的进位

      return str;

}

///高精度减法

string MINUS_INT(string str1, string str2)

///计算str1 - str2的值,先处理成 str1 ,str2 >= 0,再处理成 str1 > str2 >= 0

{

  int sign = 1;       ///sign 为符号位

  string str;

  if(str2[0] == '-')

     {

     if(str1[0]!='-')

       str = ADD_INT(str1, str2.erase(0, 1));

        else

          str=MINUS_INT(str2.erase(0,1),str1.erase(0,1));

     }

  else

     {

       if(str1[0]=='-')

        {

            str = ADD_INT(str1.erase(0, 1), str2);

            if(str[0] != '0')

                str = "-" + str;

        }

        else

 ///str1 ,str2 >= 0的情况

        {

            int res = compare(str1, str2);

            if(res == 0) return "0";

 ///二者相等

            if(res < 0)

              {

                  sign = -1;

                  str1.swap(str2);

              }

             string::size_type temp_int;

             temp_int = str1.size() - str2.size();

             for(int i = str2.size() - 1; i >= 0; i--)

               {

                   if(str1[i + temp_int] < str2[i])

                     {

                        str1[i + temp_int - 1] = str1[i + temp_int - 1] - 1;

                        str = to_char(str1[i + temp_int] - str2[i] + 10) + str;

                     }

                   else

                        str =to_char(str1[i + temp_int] - str2[i]) + str;

               }

         str = str1.substr(0,temp_int) + str;

 ///str1[i] 从i=0 到 i=temp_int - 1

         dipose_head(str,sign);

         }

    }

    return str;

}

///高精度乘法

string MULTIPLY_INT(string str1, string str2)

   {

       int i, j;

       string str;

       string::size_type len1, len2;

       len1 = str1.size(); len2 = str2.size();

       for(i = len2 - 1; i >= 0; i --)

       ///实现手工乘法

         {

             string temp_str;

             int int1 = 0, int2 = 0, int3 = to_int(str2[i]);

             if(int3 != 0)

             {

                 for(j = 1; j <= len2-1 - i; j++)

                 temp_str = '0' + temp_str;

                 for(j = len1 - 1; j >= 0; j--)

                   {

                       int1 = (int3 * to_int(str1[j]) + int2) % 10;

                       int2 = (int3 * to_int(str1[j]) + int2) / 10;

                       temp_str = to_char(int1) + temp_str;

                   }

                if(int2 != 0)

                   temp_str = to_char(int2) + temp_str;

            }

            str = ADD_INT(str, temp_str);

        }

      return str;

}

string to_str(int n)

{

    string str;

    while(n)

      {

        str.push_back(n%10+48);

        n=n/10;

      }

    reverse(str.begin(),str.end());

    return str;

}

int main()

  {

      cout<<ADD_INT("111111111111111111111111111111","1")<<endl;

        return 0;

        }