使用C++的string实现高精度加法运算的实例代码

所属分类: 软件编程 / C 语言 阅读数: 43
收藏 0 赞 0 分享

对于超大数字的运算,用long long int仍然不能解决,这时候就需要考虑通过模拟运算和数组存储来实现高精度运算。

本文讨论借助C++的string来实现高精度的运算。

首先输入的量直接存储为string,设为s1和s2。

接下来设计一个反转函数,用于把整个字符串反转(为了方便后续计算)。

string reverseStr(string input){ 
 
  string output = ""; 
  for(int i = 0; i < input.length(); i++){ 
    output.insert(output.begin(),input[i]); 
  } 
  return output; 
 
} 

原理很简单,只需要取出string从前到后的每一个字符,每次都在头的前面插入,也就得到了反序。

下面讨论和的计算方式,先把s1和s2反转,这样从前到后遍历字符串时就是从低位到高位的顺序,设进位变量为carry,初始化为0,先处理s1和s2的公共部分,从低位开始,每次得到的位和为temp,先加上前面的进位carry,然后计算本位进位temp/10,和本位和数temp%10,把它插入到结果字符串的头部之前,即可得到公共部分的和数。

接下来对于s1或者s2多出的部分,单独处理,最后注意,如果处理结束后进位不是0,要进到下一位,具体代码如下:

首先定义用于char和int互转的两个函数:

int charToInt(char c){ 
  return c - '0'; 
} 
 
char intToChar(int n){ 
  return '0' + n; 
} 

接下来是和的计算代码:

string sumofStr(string _s1, string _s2){ 
  string s1 = reverseStr(_s1); 
  string s2 = reverseStr(_s2); 
  int pMax = s1.length() > s2.length() ? s2.length() : s1.length(); 
  string sumStr = ""; 
  int p; 
  int carry = 0; 
  int temp = 0; 
  for(p = 0; p < pMax; p++){ 
    temp = charToInt(s1[p]) + charToInt(s2[p]) + carry; 
    carry = temp / 10; 
    sumStr.insert(sumStr.begin(),intToChar(temp % 10)); 
  } 
  if(p < s1.length()){ 
    for(; p < s1.length(); p++){ 
      temp = charToInt(s1[p]) + carry; 
      carry = temp / 10; 
      sumStr.insert(sumStr.begin(),intToChar(temp % 10)); 
    } 
  } 
  if(p < s2.length()){ 
    for(; p < s2.length(); p++){ 
      temp = charToInt(s2[p]) + carry; 
      carry = temp / 10; 
      sumStr.insert(sumStr.begin(),intToChar(temp % 10)); 
    } 
  } 
  if(carry > 0){ 
    sumStr.insert(sumStr.begin(),intToChar(carry % 10)); 
    carry /= 10; 
  } 
  return sumStr; 
 
} 

以上就是小编为大家带来的使用C++的string实现高精度加法运算的实例代码的全部内容了,希望对大家有所帮助,多多支持脚本之家~

更多精彩内容其他人还在看

C++广播通信实例

这篇文章主要介绍了C++实现广播通信的方法,实例讲述了C++ socket广播通信的原理与实现方法,需要的朋友可以参考下
收藏 0 赞 0 分享

C++计算ICMP头的校验和实例

这篇文章主要介绍了C++计算ICMP头的校验和的方法,代码简单实用,对于校验ICMP报文来说有不错的实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++设置超时时间的简单实现方法

这篇文章主要介绍了C++设置超时时间的简单实现方法,涉及系统函数setsockopt对套接口的操作,具有一定的实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++实现ping程序实例

这篇文章主要介绍了C++实现ping程序实例,涉及C++对于ICMP数据包的发送与回显处理,具有一定的实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++之boost::array的用法

这篇文章主要介绍了C++之boost::array的用法,以实例的形式简单讲述了静态数组的容器boost::array的使用技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++之Boost::array用法简介

这篇文章主要介绍了C++之Boost::array用法简介,较为详细的分析了Boost::array中的常见用法,并用实例的形式予以总结归纳,需要的朋友可以参考下
收藏 0 赞 0 分享

VC文件目录常见操作实例汇总

这篇文章主要介绍了VC文件目录常见操作实例汇总,总结了VC针对文件目录的各种常用操作,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

VC打印word,excel文本文件的方法

这篇文章主要介绍了VC打印word,excel文本文件的方法,是VC操作文本文件中非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

VC++获得当前进程运行目录的方法

这篇文章主要介绍了VC++获得当前进程运行目录的方法,可通过系统函数实现该功能,是非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

VC中SendMessage和PostMessage的区别

这篇文章主要介绍了VC中SendMessage和PostMessage的区别,较为全面的分析了SendMessage和PostMessage运行原理及用法上的不同之处,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多