高精度加减乘模版

#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;
        }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值