下面是别人给我的代码:

 package com.bootdo;

 public class Test {

         public static void main(String[] args) {
System.out.println(multiply("2354343543543", "3213213213"));
}
public static String multiply(String num1, String num2) {
int l = num1.length();
int r = num2.length();
//用来存储结果的数组,可以肯定的是两数相乘的结果的长度,肯定不会大于两个数各自长度的和。
int[] num = new int[l+r];
//第一个数按位循环
for(int i=0;i<l;i++) {
//得到最低位的数字
int n1=num1.charAt(l-1-i)-'0';
//保存进位
int tmp=0;
//第二个数按位循环
for(int j=0;j<r;j++) {
int n2=num2.charAt(r-1-j)-'0';
//拿出此时的结果数组里存的数+现在计算的结果数+上一个进位数
tmp=tmp+num[i+j]+n1*n2;
//得到此时结果位的值
num[i+j]=tmp%10;
//此时的进位
tmp/=10;
}
//第一轮结束后,如果有进位,将其放入到更高位
num[i+r]=tmp;
} int i=l+r-1;
//计算最终结果值到底是几位数,
while(i>0&&num[i]==0){
i--;
}
String result="";
//将数组结果反过来放,符合正常读的顺序,
//数组保存的是:1 2 3 4 5
//但其表达的是54321,五万四千三百二十一。
while(i>=0) {
result += num[i--];
}
return result;
} }

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

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

 package test;

 public class Test {

     public static void main(String[] args) {

         System.out.println(multiply("55", "44"));

     }

     public static String multiply(String num1, String num2) {
int l = num1.length();
int r = num2.length();
// 用来存储结果的数组,可以肯定的是两数相乘的结果的长度,肯定不会大于两个数各自长度的和。
int[] num = new int[l + r];
//记录内循环num开始的角标
int x = num.length - 1;
//记录外循环num开始的角标
int y = num.length - 1;
// 第一个数按位循环
for (int i = 0; i < l; i++) {
y --;
// 得到最低位的数字
int n1 = num1.charAt(l - 1 - i) - '0';
// 保存进位
int tmp = 0;
// 第二个数按位循环
for (int j = 0; j < r; j++) {
int n2 = num2.charAt(r - 1 - j) - '0';
// 拿出此时的结果数组里存的数+现在计算的结果数+上一个进位数
tmp = tmp + num[x] + n1 * n2;
// 得到此时结果位的值
num[x] = tmp % 10;
// 此时的进位
tmp /= 10;
//角标往前移一位
x --;
}
// 第一轮结束后,如果有进位,将其放入到更高位(在内循环中已经减1,此时的角标即为最高位)
num[x] = tmp;
x = y;
} int i = l + r - 1;
// 计算最终结果值开头为零的个数
int q = 0;
while (i > 0 && q <= i && num[q] == 0) {
q ++;
}
//从不为0的下标开始循环
String result = "";
for (int j = q; j <= i; j++) {
result += num[j];
} return result;
} }

最新文章

  1. JS判断字符串长度(中文长度为2,英文长度为1)
  2. textarea自适应高度
  3. CentOS下LAMP一键yum安装脚本
  4. 关闭 selinux 和防火墙
  5. 介绍几个工作开发中封装的好用的android自定义控件
  6. Linux命令-dd
  7. 大道至简—SQLite3 使用教学
  8. ie中弹出框中元素的定位
  9. JavaScript实现自定义短信模板
  10. js中年份、月份下拉框
  11. C++内存机制中内存溢出、内存泄露、内存越界和栈溢出的区别和联系
  12. 框架-thrift-zookeeper-kafka
  13. 在GridControl控件上绑定图片的几种操作方式
  14. linux syscall 详解【转】
  15. Visual Studio 2015 msvsmon.exe crashed when c++ debugging with x64
  16. 面向对象的轮播js
  17. Solidworks 2016中导出URDF文件
  18. jmeter完成数据批量添加
  19. Reactor 模式在Netty中的应用
  20. 关于GLSL中语法和调用规则的一些记录

热门文章

  1. FPGA小白学习之路(4)PLL中的locked信号解析(转)
  2. 解决getImageData跨域问题
  3. 小程序打开web-view传参数注意事项
  4. 伪元素 before 和 after 初探
  5. LeetCode 154.Find Minimum in Rotated Sorted Array II(H)(P)
  6. SQL数据库中的增删改查总结1
  7. AI广度优先搜索算法,项目实战北京地图/贪心学院
  8. Mathtype快捷键&amp;小技巧
  9. Robotutor Scratch3.0 在线编程平台上线!
  10. 通过CGAL将一个多边形剖分成Delaunay三角网