项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

最近碰到大数乘法与大数加法的需求,如果直接用int类型会溢出。于是自己写了个大数乘法与大数加法的代码,就当自己练练手了。

1.大数加法

大数加法的逻辑相对乘法稍微简单一些。先将输入的两个字符串逆序生成字符数组,然后相同位上的字符相加保存在一个结果数组中。最后遍历结果数组,如果当前位的结果大于或等于10,则先将当前位的数值除以10加入下一位,当前位的值为取10的模。

看代码如下:

package leilei.bit.edu.bigNum;public class AllNumAdd {public static String add(String s1,String s2) {//先将输入的两个串逆序生成字符数组char[] a = new StringBuilder(s1).reverse().toString().toCharArray();char[] b = new StringBuilder(s2).reverse().toString().toCharArray();//结果数组的最大长度为两个数组中长度较大的那个再加1int lenA = a.length;int lenB = b.length;int maxlen = lenA > lenB ? lenA : lenB;int[] result = new int[maxlen+1];//如果当前位超过了最大的长度,补0即可for(int i=0; i<maxlen+1; i++) {int aint = i < lenA ? (a[i] - '0') : 0;int bint = i < lenB ? (b[i] - '0') : 0;result[i] = aint + bint;}//遍历结果数组,大于10进位,当前位取10的模for(int i=0; i<result.length; i++) {if(result[i] >= 10) {result[i+1] += result[i] /10;result[i] %= 10;}}StringBuilder sb = new StringBuilder();if (result[maxlen] != 0) {sb.append(result[maxlen]);}for(int i=maxlen-1; i>=0; i--) {sb.append(result[i]);}return sb.toString();}public static void main(String[] args) {String s1 = "1234567890";String s2 = "32110";String ret = add(s1,s2);System.out.println("ret is: " + ret);}}

代码运行结果为:

ret is: 1234600000

2.大数乘法

大数乘法的逻辑相对加法稍微复杂一些。首先也先将输入的两个字符串逆序生成字符数组,假设两个字符串分别为A、B,则保存结果的数组长度为len(A)+len(B)。A的第i位于B的第j位的乘积,保存在结果数组的第i+j位上。将所有的计算结果计算完毕以后,再遍历结果数组进行进位处理。

package leilei.bit.edu.bigNum;public class Multiply {public static String multiply(String s1,String s2) {//符号问题,如果两字符串异号,最后的结果为'-'char signA = s1.charAt(0);char signB = s2.charAt(0);char sign = '+';if(signA == '-' && signB != '-') {s1 = s1.substring(1);sign = signA;}if(signB == '-' && signA != '-') {s2 = s2.substring(1);sign = signB;}char[] a = new StringBuilder(s1).reverse().toString().toCharArray();char[] b = new StringBuilder(s2).reverse().toString().toCharArray();int lenA = a.length;int lenB = b.length;//结果数组int maxLen = lenA + lenB;int[] ret = new int[maxLen];//每一位分别相乘for(int i=0; i<lenA; i++) {for(int j=0; j<lenB; j++) {ret[i+j] += (a[i] - '0') * (b[j] - '0');}}//大于10,进位for(int i=0; i<ret.length; i++) {if(ret[i] >= 10) {ret[i+1] += ret[i] /10;ret[i] %= 10;}}//如果第一位为0,不输出StringBuilder sb = new StringBuilder();if(ret[ret.length-1] != 0) {sb.append(ret[ret.length-1]);}for(int i=ret.length-2; i>=0; i--) {sb.append(ret[i]);}if (sign == '-') { //如果是异号,在结果中插入'-'sb.insert(0, sign);}return sb.toString();}public static void main(String[] args) {String s1 = "-999";String s2 = "100";String result = multiply(s1, s2);System.out.println("result is: " + result);}}

大数乘法与大数加法 java实现相关推荐

  1. 51NOD-1027 大数乘法【大数】

    1027 大数乘法  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出2个大整数A,B,计算A*B的结果. Input 第1行:大数A 第2行:大数B (A,B的长度 ...

  2. 大数的基本运算——大数乘法

    大数:即超过了计算机定义类型的范围的数,如126349678984*1321656546446546546546,这种运算的结果 太大,超过了基本类型的范围,发生溢出,这样我们就需要运用大数的算法来解 ...

  3. Java实现大数乘法_java实现大数加法、乘法(BigDecimal)

    之前写过用vector.string实现大数加法,现在用java的BigDecimal类,代码简单很多.但是在online-judge上,java的代码运行时间和内存大得多. java大数加法:求a+ ...

  4. 大数的四则运算(加法、减法、乘法、除法)

    大数的四则运算(加法.减法.乘法.除法) 前言: 在计算机中数字表示的范围是有限制的,比如我们熟知的 int.float.double 等数据类型所能表示的范围都是有限的,如果我们要对位数达到几十位. ...

  5. 51 Nod 1027 大数乘法【Java大数乱搞】

    1027 大数乘法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出2个大整数A,B,计算A*B的结果. Input 第1行:大数A 第2行:大数B (A,B的长度 ...

  6. 大数问题:大数加法 与 大数乘法 最简单大数乘法

    大数加法很简单,大叔乘法只是以大数加法为基础的,光从难度来说,两者差不多. 思路:这里没有借鉴别人牛逼的算法,现在也没有这个需求,就用最通俗的思路自己想了一个. 先举一个简单的例子 所以乘法就是每一位 ...

  7. java大数运算详解【其三】大数乘法之平方算法之按位二次展开式算法

    目录 java大数运算详解[其一]大数加减法 java大数运算详解[其二]大数乘法 java大数运算详解[其三]大数乘法之平方算法之按位二次展开式算法 java大数运算详解[其四]大数乘法之平方算法之 ...

  8. 大数处理之一(加法和乘法)

    今天看了两个大数处理的程序,一个是用JAVA 写的,一个是用C写的,处理的确实是挺方便的,虽然现在还没有学JAVA,但看起来感觉很强大,下面把JAVA 代码贴出来,学习一下: import java. ...

  9. 【算法】大数乘法问题及其高效算法

    题目 编写两个任意位数的大数相乘的程序,给出计算结果.比如: 题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 和 123 输出: 输出乘积,如:15185 ...

  10. 【恋上数据结构】贪心(最优装载、零钱兑换、0-1背包)、分治(最大连续子序列和、大数乘法)

    贪心.分治 贪心(Greedy) 问题1:最优装载(加勒比海盗) 问题2:零钱兑换 零钱兑换的另一个例子 贪心注意点 问题3:0-1背包 0-1 背包 - 实例 一些习题 分治(Divide And ...

最新文章

  1. 2、Flume1.7.0入门:安装、部署、及flume的案例
  2. git与github区别与简介
  3. 神策游戏解决方案:赋能游戏产业精品化研运升级
  4. MariaDB(MySQL)数据库的介绍及使用示例
  5. activiti学习--08 连线
  6. sql实现寻找中位数(使用sign、case、自定义变量等)
  7. signature=7a6addc49a87cb6a44a8da5a20a59d1f,Disks and Halos in Pre-Main-Sequence Stars
  8. 转:基于科大讯飞语音API语音识别开发详解
  9. Java 将鼠标改为图片的两种方法
  10. codeforces590b//Chip 'n Dale Rescue Rangers//Codeforces Round #327 (Div. 1)
  11. 2022年6月25日PMP考试通关宝典-5
  12. 四大国有银行股份制改革的确切时间
  13. 以前计算机学生都要学五笔吗,为什么曾经很火的五笔,还是给了拼音输入法?其实原因很简单...
  14. 青龙-闪电世界(脚本更新)
  15. 全网详解如何设计数据库的ER图,即实体关系图
  16. UNL图(七) 序列图和协作图
  17. Java知识点串讲之面向对象简述
  18. LVGL 获取光标坐标位置
  19. 13、Horizon App Volumes 安装配置
  20. Spring 5.X+CXF 3.X 开发SOAP Web Service服务端实例

热门文章

  1. cronmon 定时任务执行状态监控
  2. 域渗透TIPS:获取LAPS管理员密码
  3. 站点技术---301重定向
  4. 开发问题小便签(1)
  5. 搭建一个wordpress
  6. [转载] 中华典故故事(孙刚)——33 人上一百形形色色
  7. /proc/sysrq-trigger的使用
  8. Error running ‘x‘: Command line is too long. Shorten command line for x or also for Application
  9. idea module重命名后去掉后面带着的原来的名字
  10. 原生js将数组分割成固定个数一组的小数组