用java数组展示计算机的多位数相乘

我们通常用java语言实现多位数相乘时,都是直接输入两个数然后便会输出结果

例如:System.out.print(1234*567);

便直接得到结果: 699678

那计算机里面是怎么实现多位数相乘的呢?

换句话说,计算机不可能储存每个数相乘的结果。和我们计算乘法一样——我们用所背乘法口诀表来计算。计算机只记录了乘法表的结果,然后以此为基础计算所有多少位数相乘的结果。

例:

下面我们用java数组展示下用这个原理来计算多位数:

1、引进两个乘数并放入数组中

//因为int类型的整数最大范围为2147483647

//而使用字符串类型即String可以计算长度更大的多位数,所以这里不直接用int类型

String sa="12345";//乘数sa

String sb="678";//乘数sb

int i,j,carry=0;//carry用于暂时存储两数相乘时的进位

//将字符串切割为一个个char字符,并转换为整形放入整形数组里

int Array_a[]=new int[sa.length()];

int Array_b[]=new int[sb.length()];

for(i=0;i

Array_a[Array_a.length-1-i]=Integer.parseInt(sa.charAt(i)+"");

for(i=0;i

Array_b[Array_b.length-1-i]=Integer.parseInt(sb.charAt(i)+"");

注:这里我们存放整形数组时,是将字符串逆序存放,

即Array_a数组存放的是 54321

Array_b数组存放的是 876

因为后面这两个数组元素计算相乘时的进位逆序更容易添加。

2、创建一个二维数组,用于存放两个数组相乘的结果

int c[][]=new int[Array_b.length+1][Array_a.length+Array_b.length];

注:

二维数组c[][]行数为Array_b.length+1创多一行,因为用最后一行储存相加的结果

二维数组c[][]列数为Array_a.length+Array_b.length,因为两数相乘的结果的位数不可能大于这两个数的位数之和。

(即999=891 结果不可能大于三位数——即99和9两个数的位数和

同理99999=98901 结果不可能大于五位数——即999和99两个数的位数和

)

3、计算两个数组的相乘

for(i=0;i

{

for(j=0;j

{

//carry为进位 前面代码中已经创建并赋值为零 carry=0

c[i][j]=(carry+Array_b[i]*Array_a[j])%10;//进位和所乘的结果相加并求余

carry=(carry+Array_b[i]*Array_a[j])/10;//下一个高位数的进位

if(j==Array_a.length-1)//当最后一位数仍然要进位时,最后一个数直接等于进位

c[i][Array_a.length]=carry;

}

carry=0;//重置进位为0

}

为方便理解 概念图如下:

注:下面的箭头表示进位的数为多少例8*5=40向高位进4

上述代码计算完后结果为:

下一步:

//对所得结果的数组进行数组移位(即等于两数相乘时十位数往后添1个0,百位数往后添2个0等)

for(i=1;i

move_array(c[i],i);

下面是自己写的移位函数(具体怎么样不细讲):

//一维数组移位函数

public static void move_array(int a[],int leng)

{

int i;

int b[]=new int[leng];

for(i=0;i

b[i]=a[a.length-1-i];

for(i=a.length-1;i>=leng;i--)

a[i]=a[i-leng];

for(i=0;i

a[i]=b[b.length-1-i];

}

因为个位数乘完之后到十位数相乘并且需要移到十位数上面相乘

即:

移位后相加:

//用上述移位后的二维数组相加并储存到最后一行的二维数组中

for(j=0;j

{

for(i=0;i

{

c[Array_b.length][j]=c[Array_b.length][j]+c[i][j];//数组每列累加到每列最后一个数

if(i==Array_b.length-1)

{

int c1=c[Array_b.length][j];//用于存储累加前的元素

c[Array_b.length][j]=(carry+c[Array_b.length][j])%10;

carry=(carry+c1)/10;

}

}

}

概念图如下:

4、最后将结果逆序并转为字符串输出结果:

//转换为字符串

String result="";

int judge=0;//用于判断数组移去前面的0后不再移动后面的0

for(j=Array_a.length+Array_b.length-1;j>=0;j--)

{

if(c[Array_b.length][j]!=0||judge==1)

{

result=result+c[Array_b.length][j];

judge=1;

}

}

System.out.println(result);

完整代码如下:

public class 多位数相乘 {

public static void main(String[] args)

{

int a=12345,b=678;

System.out.println("计算结果:"+multiply(a, b));

System.out.println(a+"*"+b+"="+(a*b));

}

public static String multiply(int a,int b)

{

//将整数a,b转换为字符串,确定 Array_a[]和Array_b[]数组长度,

//并再次转换为整型存到 Array_a[]和Array_b[]数组中

String sa=""+a;

String sb=""+b;

int i,j,carry=0;//carry用于暂时存储两数相乘时的进位

int Array_a[]=new int[sa.length()];

int Array_b[]=new int[sb.length()];

for(i=0;i

Array_a[Array_a.length-1-i]=Integer.parseInt(sa.charAt(i)+"");

for(i=0;i

Array_b[Array_b.length-1-i]=Integer.parseInt(sb.charAt(i)+"");

//创建二维数组,用于储存 Array_a[]和Array_b[]每个元素相乘的结果

//二维数组行数为Array_b.length+1创多一行,因为用最后一行储存相加的结果

//二维数组列数为Array_a.length+Array_b.length,因为两数相乘的结果的位数不可能大于这两个数的位数之和

int c[][]=new int[Array_b.length+1][Array_a.length+Array_b.length];

//计算 Array_a[]和Array_b[]每个元素相乘的结果并储存

for(i=0;i

{

for(j=0;j

{

c[i][j]=(carry+Array_b[i]*Array_a[j])%10;

carry=(carry+Array_b[i]*Array_a[j])/10;

if(j==Array_a.length-1)

c[i][Array_a.length]=carry;

}

carry=0;

}

//对所得结果的数组进行数组移位(即等于两数相乘时十位数往后添1个0,百位数往后添2个0等)

for(i=1;i

move_array(c[i],i);

//用上述移位后的二维数组相加并储存到最后一行的二维数组中

for(j=0;j

{

for(i=0;i

{

c[Array_b.length][j]=c[Array_b.length][j]+c[i][j];//数组每列累加到每列最后一个数

if(i==Array_b.length-1)

{

int c1=c[Array_b.length][j];//用于存储累加前的元素

c[Array_b.length][j]=(carry+c[Array_b.length][j])%10;

carry=(carry+c1)/10;

}

}

}

//转换为字符串

String result="";

int judge=0;//用于判断数组移去前面的0后不再移动后面的0

for(j=Array_a.length+Array_b.length-1;j>=0;j--)

{

if(c[Array_b.length][j]!=0||judge==1)

{

result=result+c[Array_b.length][j];

judge=1;

}

}

return result;

}

//一维数组移位函数

public static void move_array(int a[],int leng)

{

int i;

int b[]=new int[leng];

for(i=0;i

b[i]=a[a.length-1-i];

for(i=a.length-1;i>=leng;i--)

a[i]=a[i-leng];

for(i=0;i

a[i]=b[b.length-1-i];

}

}

这是运行结果:

我们也同样可以用这个计算 结果比int类型范围更大的数

下面结果已经12345678*22345的结果已经超过了int类型 所以结果是错误的

以上便是我用java数组展示计算机计算多位数相乘的原理

以上仅是我个人(代码菜鸟一枚)的理解看法,如有不当请各位大佬提出!谢谢!

JAVA输出1 10与5相乘的结果_完美起航-用java数组展示计算机的多位数相乘相关推荐

  1. 玩java游戏买什么手机好用又便宜_每一款JAVA游戏都是经典,但只有四款游戏,是90%玩家从小玩到大...

    2000年彩屏手机开始流行,诺基亚作为当年世界第一的手机厂商,更是研发出了多款造型酷炫的手机,例如翻盖.推盖以及后来的触屏机,都曾被我们使用过.我还记得当年小的时候,拿着爸爸的手机在上面搜索和下载各种 ...

  2. java 以一个最高有效位为1的二进制数字开始_第02章 Java编程基础

    ·本章学习目标 熟悉Java编程的基础知识 掌握Java语言的基本数据类型.操作符.表达式 掌握Java程序的流程控制语句 熟悉并学会初步使用Java编程环境 ·本章学习内容 数据类型 常量.变量与表 ...

  3. redistemplate hash 过期时间_完美!谈谈Java中时间控制的几种解决方案

    前言 需求是这样的,在与第三方对接过程中,对方提供了token进行时效性验证,过一段时间token就会失效.后台有定时任务在获取,但是偶尔会出现token失效,这是因为在获取的时候,定时任务正在跑,可 ...

  4. java.分页上一页下一页算法_一个方便的java分页算法

    package cn.com.base.common.pagination;/** * 分页基类 * * @author cary * @since 2013-1-23 下午3:03:32*/ pub ...

  5. java判断多个线程是否跑批完成_终于有人把Java内存模型说清楚了

    内部原理 JVM 中试图定义一种 JMM 来屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果. JMM 的主要目标是定义程序中各个变量的访问规则,即 ...

  6. JAVA经过两轮面试还能被刷吗_云从科技JAVA开发工程师面试:视频进行面试,前两轮技术面试 - 职朋职业圈...

    为了帮助职业圈网友能够及时了解云从科技的面试流程以及面试过程所涉及的面试问题,职业圈小编把刚获得的云从科技面试经验马上编辑好,快速提供给大家,以便能够尽快帮助到有需要的人.这次面试总共花了20天.面试 ...

  7. Java输出PPT文件(二) - 占位符数据替换

    Java输出PPT文件(二) - 占位符数据替换 文章目录 Java输出PPT文件(二) - 占位符数据替换 0. 前言 1. 依赖 2. 代码 3. 测试 3.1 模板准备 3.2 替换结果 4. ...

  8. java输出两个整数的积_如何检查Java中的两个数字相乘是否会导致溢出?

    如何检查Java中的两个数字相乘是否会导致溢出? 我想处理两个数字相乘导致溢出的特殊情况. 代码看起来像这样: int a = 20; long b = 30; // if a or b are bi ...

  9. Java字符串的10大热点问题盘点

    Java字符串的10大热点问题盘点 下面我为大家总结了10条Java开发者经常会提的关于Java字符串的问题,如果你也是Java初学者,仔细看看吧: 1.如何比较字符串,应该用"==&quo ...

最新文章

  1. Ubuntu下通过CMake文件编译CUDA+OpenCV代码操作步骤
  2. 【翻译】Pro LINQ Language Integrated Query in C# 2008 -- 第三章 (LINQ TO Objects) 第一节
  3. 贫血的Domain Model之说
  4. 碰撞,处理碰撞,发射 Learn Unreal Engine (with C++)
  5. React Native 实现物流进度信息
  6. spring boot maven项目返回值乱码的解决方法
  7. Python Web项目自定义虚拟环境
  8. Redis集群搭建与简单使用
  9. Facebook开源MySQL分支获大佬捧场
  10. 遍历查询+从非根节点开始遍历+从下向上遍历树+从层次化查询中删除节点和分支...
  11. 51单片机数值存储c语言教程,单片机c语言教程:C51变量
  12. wx.login 和 wx.getUserProfile 同时使用问题
  13. 买二手苹果macbook被骗真实经历
  14. 如何修复dns服务器超时,DNS服务器安全及解析超时问题的解决
  15. 朋友圈大数据:你的朋友圈出卖了你,大数据就是这么给力!!!
  16. HTTP协议格式(请求格式、响应格式)
  17. 一个mysql事务引发的思考(血案)
  18. 数据结构 java c_数据结构——链表(用Java实现C语言的指针,思想)
  19. python 查看包的版本
  20. 将window目录挂载到Linux目录下

热门文章

  1. Jmeter Web 性能测试入门 (四):一个小实例带你学会 Jmeter 脚本编写
  2. Oracle EBS SLA取值
  3. VS Code编写html(2)
  4. java基础-java语言中的关键字总结
  5. 两种方式实现登录跳转新窗体
  6. Luogu 4491 [HAOI2018]染色
  7. 【XSY3350】svisor - 点分治+虚树dp
  8. Ubuntu连网的问题
  9. IIS 之 未能加载文件或程序集“IBM.Data.DB2”或它的某一个依赖项。试图加载格式不正确的程序。...
  10. Java之美[从菜鸟到高手演变]之Spring源码学习 - 环境搭建