高精度问题之大数相加(原来就是用字符串相加,模拟手算这么简单!)

解题心的: 就是基本的一对一模拟手算。。借助c++的string 不用逆序运算了。很方便的补0.  最后处理下前导0的问题。

#include <iostream>
#include <string>
using namespace std;// 实现大数相加  结果存放在num中 void bigIntergerAdd(string &num, string add) {int goBit = 0; // 存放进位// 先交换下顺序  加数的位数要比较少if (num.length() < add.length()) {string tmp = num;num = add;add = tmp;} string tmp (num.length() - add.length(), '0');add = tmp + add; // 利用string的+号特性  不采用逆序相加法 int len1 = num.length(), len2 = add.length();for (int i = len1 -1 ; i>= 0; --i) {int tmp =  ((num[i] - '0') + (add[i] - '0') + goBit) ;num[i] = tmp% 10 + '0';goBit = tmp/10;}// 特殊情况处理if (goBit != 0) num.insert(0, string(1, (char)goBit +'0'));
} int main(int argc, char** argv) {string s1;string result;int i =0;while (cin>> s1) {if (s1 == "0") {cout<< result<< endl;break;} if (i ==0) {i=1;result = s1;} else bigIntergerAdd(result, s1);} return 0;
}

参考:http://blog.csdn.net/wu5151/article/details/47100085

----------------------------------------------------------------------------------

大数相乘:总的思路比较简单, 就是模拟手算。 用较短(或相等)长度的数的每一位与较长数一一相乘。要注意的是,相乘所得结果需要补0的细节 。然后就是单纯的大数相加。

#include <iostream>
#include <string>
using namespace std; // 大数相乘 string bigIntegerPlus(string res, string plusN) {string ret; if (res.length()< plusN.length()) {string tmp = res;res = plusN;plusN = tmp; }int len1 = res.length(), len2 = plusN.length();for (int i = len2-1; i>=0; --i ) {string tmp(len1, '0'); // 存放相乘的中间结果 int goBit =0;for (int j= len1-1; j >=0; --j) {int mid = (res[j] -'0') * (plusN[i] -'0') + goBit;tmp[j] = mid%10 + '0';goBit = mid /10;}if (goBit != 0) tmp.insert(0, string(1,goBit +'0'));for (int m=0; m< len2 -1-i; ++m)tmp.push_back('0'); // 补位  // 相乘后就相加  大数相加if (i == len2-1)ret = tmp;else {int goBit2 =0; string s(tmp.length() - ret.length() ,'0');ret = s + ret;for (int m = tmp.length()-1; m>=0; --m) {int mid = (tmp[m] -'0')+(ret[m] - '0')  + goBit2;ret[m] = mid %10 +'0';goBit2 = mid/ 10;    }if (goBit2 != 0) ret.insert(0, string(1,goBit +'0'));}     } // 去掉前导0while (ret.length() >1 && ret[0] == '0')ret.erase(0,1);return ret;
}int main(int argc, char** argv) {string res, plusN;while (cin>> res>> plusN) {cout<< bigIntegerPlus(res, plusN)<< endl;}return 0;
}

参考:http://blog.csdn.net/wu5151/article/details/47099971

----------------------------------------------------------------------------------

实现的是大数跟int类型的相除和求余,解题心得: 模拟手算的过程。需要注意的是。其中余数的存放要用long long存放比较好。因为如果采用int类型那么     rem = prem * 10/*向后退一位*/ + src[i] - '0';    这行代码可能会出现溢出问题。

#include <iostream>
#include <cstring>
using namespace std;void bigDivision(char *src, int num, char sign) {long long rem = 0; // 存放新余数 long long prem = 0; // 原余数char  res[10000] ="";bool flag = true;int k = 0;for (int i=0; i< strlen(src); ++i) {rem = prem * 10/*向后退一位*/ + src[i] - '0';if (rem / num >0 || rem ==0) {res[k++] = rem/ num + '0';prem = rem %num;flag = false;}  else {prem = rem;if (!flag)res[k++] = '0';}}if (sign == '%') {cout<< prem<< endl;return;}for (int i =0; i< k; ++i) cout<< res[i];cout<< endl;
} int main(int argc, char** argv) {char src[10000] = "";int num;char sign;while (scanf("%s %c %d", src, &sign, &num) != EOF) {bigDivision(src, num, sign);}return 0;
}

参考:http://blog.csdn.net/wu5151/article/details/47100165

----------------------------------------------------------------------------------

高精度问题之大数求幂,解题思路: 因为做了大数相加 ,这题也就没什么好思考的。不同之处就是先去掉小数点,计算结果后在适当位置插入小数点即可。这个算法可以计算更大的数。但必须包含小数点。。。。。。

#include <iostream>
#include <string>
using namespace std;// 求幂  思路: 先变成整数相乘   然后根据小数的位数 结合幂  算出小数点该结果字符串的位置 即可string bigIntegerPlus(string src, string num) {string tmp = src;for (int i =num.length() -1; i >= 0 ; --i) {string mid(tmp.length(),'0');int goBit =0;for (int j =  tmp.length()-1; j >= 0; --j) {int tm = goBit + (tmp[j] -'0')* (num[i] - '0');mid[j] = tm% 10 +'0';goBit = tm  /10;}for (int q = num.length()-1; q> i; --q) mid.push_back('0');if (goBit != 0) mid.insert(0, string(1, (char)goBit +'0'));// 加法运算if (i == num.length()-1)src = mid;else {goBit =0;string s(mid.length() - src.length(), '0');src = s + src;for (int j = mid.length()-1; j>=0; --j) {int tm = (mid[j] - '0') +(src[j] - '0') + goBit;src[j] = tm %10 + '0';goBit = tm /10;}if (goBit !=0) src.insert(0, string(1, (char)goBit +'0'));}    }return src;
}int main(int argc, char** argv) {string str;while ( getline(cin, str)) {// 分割出待积数 和 幂  以及小数点位置int i =0;int index = 0;// 小数位置int count = 0;//幂次数string num;while ( i< str.length()) {if ( str[i] != ' ') {if (str[i] == '.')index = i;elsenum.push_back(str[i]);++i;continue;}while ( !isdigit(str[i])) ++i;if (i + 1 == str.length())count = str[i] - '0';else count = (str[i] - '0') * 10 + str[i+1] - '0';        break;        }index = num.length() - index;string res = num;for (int i =0; i< count-1; ++i) {res = bigIntegerPlus( res, num);}index = index * count;res.insert(res.length() - index, string(".")); while (res.length() >1 && res[0] == '0')res.erase(0, 1);for (int i =res.length()-1; i>=0; --i) {if (res[i] == '0' )res.erase(i, i+1);else break;}cout<< res<< endl;    }return 0;
}

大数的相加 乘 余 幂相关推荐

  1. c语言中int下小数求余大数,Sicily1020-大数求余算法及优化

    Github最终优化代码: https://github.com/laiy/Datastructure-Algorithm/blob/master/sicily/1020.c 题目如下: 1020. ...

  2. 常用类 (三) ----- BigDecimal和BigInteger大数类

    相关文章: <常用类 (一) ----- Arrays数组工具类> <常用类 (二) ----- Math类> <常用类 (三) ----- BigDecimal和Big ...

  3. python 幂_python 幂次方

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python3获取的是浮点数(小数2.5)print(52)(整除-- 地板除) ...

  4. python的取整和取余_python取余取整

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 取余的公式:余数=除数-被除数*商python的的余数是按照整除(向下取整)得到 ...

  5. 算法:乐团站位 【模拟 vs 大数】

    本题来自力扣杯竞赛真题-2021春赛第一题: LCP 29.乐团站位,难度为简单,考察模拟和大数 题目 某乐团的演出场地可视作 num * num 的二维矩阵 grid(左上角坐标为 [0,0]),每 ...

  6. 大数系列——大数加法

    这几天专门学习了一下大数的有关计算方法,大数加减乘除模都会在后面讲到. 一.大数加法: 加法算是最简单的一类大数问题,先写上我的代码: <span style="font-size:1 ...

  7. 2019-2020 PHP面试-12家(答案全)

    目录 一.洛可可设计 1.判断一个字符串A(ghtabcdef)是否包含另一个字符串B(bac),不考虑顺序. 2.ip的正则表达式 3.Restful动词中post,patch,put的区别?什么是 ...

  8. shell编程基础之基本文本工具集合

    一 shell简介: 1 描述 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用 ...

  9. python的表达式3or5_Python 简明教程 --- 5,Python 表达式与运算符

    靠代码行数来衡量开发进度,就像是凭重量来衡量飞机制造的进度. -- Bill Gates 目录 1,什么是表达式 表达式是代码的重要组成部分,一个表达式由运算符和操作数两部分组成. 一个表达式就描述了 ...

最新文章

  1. vMA学习笔记之一:将vMA加入域
  2. H.264NLU和RTSP协议理解
  3. python内置函数sorted(x)的作用是_Python内置filter与sorted函数
  4. VMware虚拟机 CentOS 6.5系统安装配置详细图文教程 --技术支持TPshop商城
  5. 委托C# 生活 实例
  6. CentOS 安装宋体字体
  7. 万维网发布服务 w3svc 已停止 除非万维_万维网和互联网的区别
  8. SQL 字符 数字 转换字母
  9. SpringBoot 2.1.5(20)---JSON
  10. android 版本更新
  11. 【网络安全工程师面试合集】—谈一谈什么是网络安全?
  12. 字符串-创建//比较
  13. App Shortcuts 快捷方式 Android7 1 的3D Touch
  14. october php,关于Laravel之October的安装配置过程
  15. Ubuntu下给U盘分区
  16. LaTex便捷插入罗马数字
  17. 淘宝店铺如何装修呢?
  18. PS进阶篇——如何PS软件给公司单位图片加版权水印(六)
  19. 记一次暴力破解tomcat后台密码(附带python脚本)
  20. 无符号数和有符号数的溢出判断

热门文章

  1. Python装饰器、生成器、内置函数、Json-Day05
  2. HibernateBaseDAO
  3. 针对监控摄像机(海康、大华等)进行手动录像的录像文件播放器功能设计
  4. sql server 提示无法彻底删除_复制-而无法删除数据库或重新配置发布订阅
  5. djandgo model id
  6. Matlab练习:timer(2)
  7. kafka消费的三种模式_快速认识Kafka
  8. 【Paper】研究论文不会写?先来学学怎么做西红柿炒鹌鹑蛋吧!
  9. 云炬随笔20171103
  10. [scala-spark]7. list 与 map