下面是别人给我的代码:

  1. package com.bootdo;
  2.  
  3. public class Test {
  4.  
  5. public static void main(String[] args) {
  6. System.out.println(multiply("2354343543543", "3213213213"));
  7. }
  8. public static String multiply(String num1, String num2) {
  9. int l = num1.length();
  10. int r = num2.length();
  11. //用来存储结果的数组,可以肯定的是两数相乘的结果的长度,肯定不会大于两个数各自长度的和。
  12. int[] num = new int[l+r];
  13. //第一个数按位循环
  14. for(int i=0;i<l;i++) {
  15. //得到最低位的数字
  16. int n1=num1.charAt(l-1-i)-'0';
  17. //保存进位
  18. int tmp=0;
  19. //第二个数按位循环
  20. for(int j=0;j<r;j++) {
  21. int n2=num2.charAt(r-1-j)-'0';
  22. //拿出此时的结果数组里存的数+现在计算的结果数+上一个进位数
  23. tmp=tmp+num[i+j]+n1*n2;
  24. //得到此时结果位的值
  25. num[i+j]=tmp%10;
  26. //此时的进位
  27. tmp/=10;
  28. }
  29. //第一轮结束后,如果有进位,将其放入到更高位
  30. num[i+r]=tmp;
  31. }
  32.  
  33. int i=l+r-1;
  34. //计算最终结果值到底是几位数,
  35. while(i>0&&num[i]==0){
  36. i--;
  37. }
  38. String result="";
  39. //将数组结果反过来放,符合正常读的顺序,
  40. //数组保存的是:1 2 3 4 5
  41. //但其表达的是54321,五万四千三百二十一。
  42. while(i>=0) {
  43. result += num[i--];
  44. }
  45. return result;
  46. }
  47.  
  48. }

以下是我自己修改后的代码,因为上面的代码我在开始看的时候陷入了一个误区,就是num[]存储的时候是从角标为0开始的,在最后处理的时候要将数组结果反过来,一般在做两数相乘的时候都是从后往前算(即第二个数的个位与第一个数的个位、十位...依次相乘,且从右往左书写,养成了习惯),因此我依据自己的习惯将逻辑稍作修改,从右往左存储,在最后直接从左往右读取即可。

*注:代码中   num1.charAt(l - 1 - i) - '0';  是根据asc码将字节转为整形的过程。

  1. package test;
  2.  
  3. public class Test {
  4.  
  5. public static void main(String[] args) {
  6.  
  7. System.out.println(multiply("55", "44"));
  8.  
  9. }
  10.  
  11. public static String multiply(String num1, String num2) {
  12. int l = num1.length();
  13. int r = num2.length();
  14. // 用来存储结果的数组,可以肯定的是两数相乘的结果的长度,肯定不会大于两个数各自长度的和。
  15. int[] num = new int[l + r];
  16. //记录内循环num开始的角标
  17. int x = num.length - 1;
  18. //记录外循环num开始的角标
  19. int y = num.length - 1;
  20. // 第一个数按位循环
  21. for (int i = 0; i < l; i++) {
  22. y --;
  23. // 得到最低位的数字
  24. int n1 = num1.charAt(l - 1 - i) - '0';
  25. // 保存进位
  26. int tmp = 0;
  27. // 第二个数按位循环
  28. for (int j = 0; j < r; j++) {
  29. int n2 = num2.charAt(r - 1 - j) - '0';
  30. // 拿出此时的结果数组里存的数+现在计算的结果数+上一个进位数
  31. tmp = tmp + num[x] + n1 * n2;
  32. // 得到此时结果位的值
  33. num[x] = tmp % 10;
  34. // 此时的进位
  35. tmp /= 10;
  36. //角标往前移一位
  37. x --;
  38. }
  39. // 第一轮结束后,如果有进位,将其放入到更高位(在内循环中已经减1,此时的角标即为最高位)
  40. num[x] = tmp;
  41. x = y;
  42. }
  43.  
  44. int i = l + r - 1;
  45. // 计算最终结果值开头为零的个数
  46. int q = 0;
  47. while (i > 0 && q <= i && num[q] == 0) {
  48. q ++;
  49. }
  50. //从不为0的下标开始循环
  51. String result = "";
  52. for (int j = q; j <= i; j++) {
  53. result += num[j];
  54. }
  55.  
  56. return result;
  57. }
  58.  
  59. }

java两数相乘基础算法的更多相关文章

  1. Java 递归解决 &quot;仅仅能两数相乘的计算器计算x^y&quot; 问题

    /** * 求一个数的乘方 * 求x^y,y是一个正整数. 设计算器仅仅能计算两数相乘,不能一次计算n个数相乘. * 知:2^5=(2^2)^2*2; 2^6=(2^2)^3=((4)^2)*4; 2 ...

  2. python 用加法实现a,b两数相乘

    """思路:1.a * b = a + a + a + ... 2.a * b = n个a相加,只需求证b = n即可 3.用for 循环遍历即可,b就是range的最大 ...

  3. C语言——<计算>_较大两个数相乘

    例题:9876543210*1234567890 的乘积 分析:正常的数据结构已经无法满足这么大的数相乘的结果.只能使用数组来进行操作. 1.两个数都用字符数组来接收. 2.接收后,因为每一位要乘以另 ...

  4. Java算法练习——两数之和

    题目链接 题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利 ...

  5. Java基础算法集50题

    最近因为要准备实习,还有一个蓝桥杯的编程比赛,所以准备加强一下算法这块,然后百度了一下java基础算法,看到的都是那50套题,那就花了差不多三个晚自习的时间吧,大体看了一遍,做了其中的27道题,有一些 ...

  6. 【算法与数据结构】在n个数中取第k大的数(基础篇)

    (转载请注明出处:http://blog.csdn.net/buptgshengod) 题目介绍            在n个数中取第k大的数(基础篇),之所以叫基础篇是因为还有很多更高级的算法,这些 ...

  7. Java基础算法

    i++;++i; i--;--i; int a=5;int b=a++;++放在后面,表示先使用a的值,a再加1b=5,a=a+1,a=6 int c=5;int d=++c;++放在前面,表示先将c ...

  8. ✡ leetcode 167. Two Sum II - Input array is sorted 求两数相加等于一个数的位置 --------- java

    Given an array of integers that is already sorted in ascending order, find two numbers such that the ...

  9. java基础算法题

    为了提高自己的代码能力和算法能力,我决定每天学习一道算法题,吸收前辈思想. [程序1] TestRabbit.java 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三 ...

随机推荐

  1. 机器学习的盛宴:NIPS 2015

    作者:微软亚洲研究院实习生:林添 冰雪王国的浪漫 机器学习的盛宴 NIPS(Advances in Neural Information Processing Systems,神经信息处理系统进展大会 ...

  2. linux sort排序命令的高级用法

    在linux中,使用sort按行进行排序是很简单的.不过有时,生活总是爱抛给你一个一个的问题.如果使用sort按多个列值排列,同时使用tab作为分隔符,而且对于某些列需要进行逆序排列,这样sort命令 ...

  3. 带你学习ES5中新增的方法

    1. ES5中新增了一些方法,可以很方便的操作数组或者字符串,这些方法主要包括以下几个方面 数组方法 字符串方法 对象方法 2. 数组方法 迭代遍历方法:forEach().map().filter( ...

  4. 何用Java8 Stream API进行数据抽取与收集

    上一篇中我们通过一个实例看到了Java8 Stream API 相较于传统的的Java 集合操作的简洁与优势,本篇我们依然借助于一个实际的例子来看看Java8 Stream API 如何抽取及收集数据 ...

  5. webpack从0到1超详细超基础学习教程

    概念 自己是一个一听到webpack就头大,看着一堆不知道那是什么玩意的东西总觉得自己做好前端就行了,但是在使用vue-cli的时候总觉得要改其中的一些东西进行项目初始化的时候能够更好使用!所以想要根 ...

  6. 每个 JavaScript 工程师都应当知道的 10 个面试题

    1. 能说出来两种对于 JavaScript 工程师很重要的编程范式么? JavaScript 是一门多范式(multi-paradigm)的编程语言,它既支持命令式(imperative)/面向过程 ...

  7. 零基础JavaScript编码(二)

    任务目的 在上一任务基础上继续JavaScript的体验 学习JavaScript中的if判断语法,for循环语法 学习JavaScript中的数组对象 学习如何读取.处理数据,并动态创建.修改DOM ...

  8. Codeforces Round #295 (Div. 2) B. Two Buttons 520B

    B. Two Buttons time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  9. 基于 HTML + WebGL 结合 23D 的疫情地图实时大屏 PC 版

    前言 2019年12月以来,湖北省武汉市陆续发现了多例肺炎病例,现已证实为一种新型冠状病毒感染引起的急性呼吸道传染病并蔓延全国,肺炎疫情牵动人心,人们每天起来第一件事变成了关注疫情进展,期望这场天灾早 ...

  10. 原生js实现随着滚动条滚动,导航会自动切换的效果

    最近学习前端,把前面用原生js写的一段有关tab切换效果的代码贴上,实现的效果比较简陋,请大家见谅 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1 ...