十进制数据相减(大数据)
发布日期:2021-11-07 18:53:29
浏览次数:2
分类:技术文章
本文共 4972 字,大约阅读时间需要 16 分钟。
#ifndef UNICODEtypedef string _tstring;#elsetypedef wstring _tstring;#endif //!bool isSmaller(_tstring str1, _tstring str2) { int n1 = str1.length(), n2 = str2.length(); if (n1 < n2) { return true; } if (n2 < n1) { return false; } for (int i = 0; i < n1; i++) { if (str1[i] < str2[i]) { return true; } else if (str1[i] > str2[i]) { return false; } } return false;}/***********************************************************************函数名称 :SubBigDataAux函数功能 :两个大数据数值相减(必须正整数)函数参数 : 参数列表格式 [_IN_ _OUT_ _OPTION_] 参数名 说明信息@param _tstring str1 _IN_ 第一个相减的数值@param _tstring str2 _IN_ 第二个相减的数值@param bool bRemovePrex=true 是否移除前导的0 返回值 : @return _tstring 两个数值相减的结果------------------------------------------------------------------------备注 :输入的参数的要求:“必须是正数”如果确保数据是正整数的话,请使用SubBigDataAux,这个函数运行的效率更高如果不能够保证输入参数是正整数的话,请使用SubBigData这个函数------------------------------------------------------------------------示例 :************************************************************************/_tstring SubBigDataAux(_tstring str1, _tstring str2,bool bRemovePrex=true) { bool bNeg = false; if (isSmaller(str1, str2)) { swap(str1, str2); bNeg = true; } _tstring str = L""; int n1 = str1.length(), n2 = str2.length(); reverse(str1.begin(), str1.end()); reverse(str2.begin(), str2.end()); int carry = 0; for (int i = 0; i < n2; i++) { int sub = ((str1[i] - '0') - (str2[i] - '0') - carry); if (sub < 0) { sub = sub + 10; carry = 1; } else { carry = 0; } str.push_back(sub + '0'); } for (int i = n2; i < n1; i++) { int sub = ((str1[i] - '0') - carry); carry = 0; str.push_back(sub + '0'); } reverse(str.begin(), str.end()); if (bRemovePrex) { //去掉前导的‘0’ while (true) { if (str[0] == L'0') { str.erase(str.begin()); } else { break; } } } if (str.empty()) { str = L"0"; } if (bNeg) { str.insert(str.begin(), L'-'); } return str;}/***********************************************************************函数名称 :AddBigData函数功能 :两个大数据进行相加(必须为正整数 )函数参数 : 参数列表格式 [_IN_ _OUT_ _OPTION_] 参数名 说明信息@param _tstring s _IN_ 第一个相加的结果@param _tstring r _IN_ 第二个相加的结果返回值 : @return _tstring 两个整数相加的结果------------------------------------------------------------------------备注 :输入的参数的要求:“必须是正整数”如果确保数据是正整数的话,请使用AddBigDataAux,这个函数运行的效率更高如果不能够保证输入参数是正整数的话,请使用AddBigData这个函数------------------------------------------------------------------------示例 :************************************************************************/_tstring AddBigDataAux(_tstring s, _tstring r) { int re = 0; _tstring digit; if (r.length() < s.length()) r.insert(r.begin(), s.length() - r.length(), '0'); else if (r.length() > s.length()) s.insert(s.begin(), r.length() - s.length(), '0'); for (int i = s.length() - 1; i >= 0; --i) { int a = (int(s[i] + r[i]) + re - 96); digit.insert(digit.begin(), char(a % 10 + 48)); re = a / 10; } if (re != 0) digit.insert(digit.begin(), char(re + 48)); return digit;}/***********************************************************************函数名称 :SubBigData函数功能 :两个大数据相减(可以为float型的数据)函数参数 : 参数列表格式 [_IN_ _OUT_ _OPTION_] 参数名 说明信息@param _tstring s _IN_ 第一个相减的数据@param _tstring r _IN_ 第二个相加的数据返回值 : @return 返回两个字符串相减的结果------------------------------------------------------------------------备注 :输入的参数的要求:“必须是正数”,但是可以是浮点型的数据如果确保数据是正整数的话,请使用SubBigDataAux,这个函数运行的效率更高如果不能够保证输入参数是正整数的话,请使用SubBigData这个函数------------------------------------------------------------------------示例 :************************************************************************/_tstring SubBigData(_tstring s, _tstring r){ size_t pos1 = s.find(L'.'); size_t pos2 = r.find(L'.'); _tstring SInt, SFac, RInt, RFac;//两个字符串的整数部分和小数部分 if (pos1 == _tstring::npos)//如果没有找到的话 { SInt = s; SFac = L""; } else { SInt = s.substr(0, pos1); SFac = s.substr(pos1 + 1); } if (pos2 == _tstring::npos) { RInt = r; RFac = L""; } else { RInt = r.substr(0, pos2); RFac = r.substr(pos2 + 1); } _tstring Int, Fac;//整数相减的结果、浮点数相减的结果 if (SFac.length() > RFac.length()) { RFac.insert(RFac.end(), SFac.length() - RFac.length(), '0'); } else { SFac.insert(SFac.end(), RFac.length() - SFac.length(), '0'); } bool bNeg = false; if (isSmaller(SInt, RInt)) { swap(SInt, RInt); swap(SFac, RFac); bNeg = true; } else if ((SInt==RInt)&&(isSmaller(SFac,RFac))) { swap(SInt, RInt); swap(SFac, RFac); bNeg = true; } Int = SubBigDataAux(SInt, RInt); Fac = SubBigDataAux(SFac, RFac,false); if (Fac.find(L'-') != _tstring::npos)//如果相减为负数的话,说明要进行进制操作 { _tstring temp = L"1"; temp.insert(temp.end(), SFac.length(), L'0'); temp = AddBigDataAux(temp, SFac); Fac = SubBigDataAux(temp, RFac);//小数处理部分 Fac.insert(Fac.begin(), L'.'); //整数处理部分 if (Int.find(L'-') != _tstring::npos) { Int.erase(Int.begin()); Int = SubBigDataAux(Int, L"1"); Int.insert(Int.begin(), L'-'); } else { Int = SubBigDataAux(Int, L"1"); } } else { //小数部分 Fac.insert(Fac.begin(), L'.'); } _tstring result = Int + Fac; if (bNeg) { result.insert(result.begin(), L'-'); } return result;}
转载地址:https://blog.csdn.net/zhanggusheng/article/details/84582000 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年03月28日 20时21分55秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
websocket 项目启示录
2019-04-27
性能测试
2019-04-27
Java电商系统商品详情页存储方案设计
2019-04-27
Jacoco探针源码解析(0.8.5 版本)
2019-04-27
Java的Instrumentation类原理分析
2019-04-27
"org.jacoco.agent.rt" 在 maven 中找不到
2019-04-27
计算机中的dump到底是什么意思?
2019-04-27
JaCoCo探针策略原理及案例总结
2019-04-27
阿里三面:说说线程封闭与ThreadLocal的关系
2019-04-27
看完让你吊打面试官-@Autowired注解到底怎么实现的?
2019-04-27
MySQL的行锁、表锁、间隙锁详解
2019-04-27
和阿里面试官扯了半小时ArrayBlockingQueue源码
2019-04-27
远离996,PDMan开源免费的国产数据库建模工具!
2019-04-27
现代操作系统的存储器结构
2019-04-27
深度揭秘年薪60W的阿里P7简历制作过程!
2019-04-27
可能是全网最全的SpringBoot启动流程源码分析(基于 2.1.5 版本)
2019-04-27
BAT华为等一线大厂工程师都在用的优秀 IDEA 插件
2019-04-27
屏幕录制和编辑神器ScreenFlow轻松上手
2019-04-27
防止Java序列化/反射破坏单例模式的解决方案
2019-04-27
面试/工作必备的vim基础及快捷键操作
2019-04-27