用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<sa.length();i++)
Array_a[Array_a.length-1-i]=Integer.parseInt(sa.charAt(i)+"");
for(i=0;i<sb.length();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<Array_b.length;i++)
{
for(j=0;j<Array_a.length;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<c.length;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.length;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<b.length;i++)
a[i]=b[b.length-1-i];
}
因為個位數乘完之后到十位數相乘并且需要移到十位數上面相乘
即:

移位后相加:
//用上述移位后的二維陣列相加并儲存到最后一行的二維陣列中
for(j=0;j<Array_a.length+Array_b.length;j++)
{
for(i=0;i<Array_b.length;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<sa.length();i++)
Array_a[Array_a.length-1-i]=Integer.parseInt(sa.charAt(i)+"");
for(i=0;i<sb.length();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<Array_b.length;i++)
{
for(j=0;j<Array_a.length;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<c.length;i++)
move_array(c[i],i);
//用上述移位后的二維陣列相加并儲存到最后一行的二維陣列中
for(j=0;j<Array_a.length+Array_b.length;j++)
{
for(i=0;i<Array_b.length;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.length;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<b.length;i++)
a[i]=b[b.length-1-i];
}
}
這是運行結果:

我們也同樣可以用這個計算 結果比int型別范圍更大的數


下面結果已經12345678*22345的結果已經超過了int型別 所以結果是錯誤的
以上便是我用java陣列展示計算機計算多位數相乘的原理
以上僅是我個人(代碼菜鳥一枚)的理解看法,如有不當請各位大佬提出!謝謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/171423.html
標籤:其他
上一篇:mysql
下一篇:但行好事,莫問前程
