下面是别人给我的代码:

 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;
} }

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. KEMET推出新的多层陶瓷电容器,用于市电供电的应用

    前言:2019年12月2日,全球领先的电子组件供应商KEMET公司 (“ KEMET”或“公司”)推出了一系列新的表面安装设备(SMD)安全认证的多层陶瓷电容器(MLCC),用于市电供电的应用.与现有 ...

  2. go语言指南之映射练习

    练习:映射 实现 WordCount.它应当返回一个映射,其中包含字符串 s 中每个“单词”的个数.函数 wc.Test 会对此函数执行一系列测试用例,并输出成功还是失败. 你会发现 strings. ...

  3. SpringBoot图文教程9—SpringBoot 导入导出 Excel 「Apache Poi」

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...

  4. 与Nexus为Maven搭建私服

    目录 Nexus 的概述 Nexus 安装与部署 Nexus 在 Windows 上安装与使用 安装 使用 Nexus 在 Linux 上安装与使用 Nexus 的概述 引用百度百科一段话 Nexus ...

  5. ubuntu16.04安装库、插件报错:

    安装一些插件.库,遇到报错 Could not fetch URL https://pypi.org/simple/pytest-pycodestyle/: There was a problem c ...

  6. ajax的post提交 序列化json参数

    再一次项目中,很常见的就是我的前端需要异步进行和后端交互 ,然而需要携带一些参数过去,并且参数类型是json 怎么办呢? 这个时候我们就需要 进行参数序列化 很简单就两句话 如下图 我们看 JSON, ...

  7. mongoose基本增删改查

    1.安装 打开命令行 npm i mongoose 2.连接数据库 // 引入安装的包 var mongoose = require('mongoose'); mongoose.connect('mo ...

  8. python装饰器见解笔记

    def zsq(fun): def zsq_n(*args,**kwargs) print('这是装饰器需要运行内容') r = fun(*args,**kwargs) print('在被装饰函数执行 ...

  9. ggplot2(6) 标度、坐标轴和图例

    6.1 简介 标度控制着数据到图形属性的映射.标度将我们的数据转化为视觉上可以感知的东西:例如大小.颜色.位置和形状.标度也为我们提供了读图时所使用的工具:坐标轴和图例. 执行标度的过程分为三步:变换 ...

  10. 【分布式锁】01-使用Redisson实现可重入分布式锁原理

    前言 主流的分布式锁一般有三种实现方式: 数据库乐观锁 基于Redis的分布式锁 基于ZooKeeper的分布式锁 之前我在博客上写过关于mysql和redis实现分布式锁的具体方案:https:// ...