大数乘法
使用java语言的int数组与StringBuffer来实现。
日常中,我们使用java来计算两数乘法时,我们会在遇到一些比较大的数字计算时,便无可奈何(int不够大),这时一般采用BigInteger的方法进行计算,但是该方法也有一定的限制,或者说,我们是可以去尝试去使用String来实现和表示大数乘法的效果。
编程思路:
首先我们要确定使用字符串后我们如何去实现我们的乘法计算,不妨我们回归竖式计算,进行模拟然后得出结果。
例如:37*46的计算过程,我们也可以这样计算:如下图。
先不考虑进位的问题,将两个数字相乘的结果当作一个个位数(不去进行进位,最后再依次进位,方便计算机操作,当然,方法多样,并不局限于此)
我们也可以发现上述规律a位数*b位数≤(a+b)位数
所以我们如果需要得到最后的位数的话,可以通过这个规律进行计算。
代码:
首先,我们采用由俭入繁的理念:从简单的开始,再到复杂:
我们考虑的是两个正整数的大数乘法:
//大数乘法 import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String a = sc.nextLine(); String b = sc.nextLine(); //注意:这里直接将数字计算后的结果相加起来了,直接得到最后一行 int[] s = new int[b.length()+a.length()]; System.out.print(a+" * "+b+" = "); for (int i = b.length()-1; i >= 0; i--) { for (int k = a.length()-1; k >= 0; k--) { int t = (b.charAt(i)-'0')*(a.charAt(k)-'0'); s[s.length-1-(a.length()-1-k+(b.length()-1-i))] += t; } } //进位计算 for(int i=s.length-1;i>0;i--) { if(s[i]>=10){ s[i-1] +=s[i]/10; s[i]=s[i]%10; } } //清空前置零(int转向StringBuffer的时候可能会多0),并使用字符串表示出答案 StringBuffer ans = new StringBuffer(); for (int i : s) { ans.append(i); } while(ans.charAt(0)=='0'){ ans.deleteCharAt(0); } System.out.println(ans); sc.close(); } }
好的计算成功,那么如果有负数存在呢?
我们只需要加上如下的判断符号的代码即可
//判断符号 Boolean flag = true; if(a.charAt(0)=='-'&&b.charAt(0)=='-') { a = a.substring(1); b = b.substring(1); flag = true; } if(a.charAt(0)!='-'&&b.charAt(0)!='-'){ flag = true; } if(a.charAt(0)=='-'&&b.charAt(0)!='-') { a = a.substring(1); flag = false; } if(a.charAt(0)!='-'&&b.charAt(0)=='-') { b = b.substring(1); flag = false; } if(!flag)System.out.print("-");
完整的代码如下:
//大数乘法(有符号)
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String a = sc.nextLine();
String b = sc.nextLine();
System.out.print(a+" * "+b+" = ");
//判断符号
Boolean flag = true;
if(a.charAt(0)=='-'&&b.charAt(0)=='-')
{
a = a.substring(1);
b = b.substring(1);
flag = true;
}
if(a.charAt(0)!='-'&&b.charAt(0)!='-'){
flag = true;
}
if(a.charAt(0)=='-'&&b.charAt(0)!='-')
{
a = a.substring(1);
flag = false;
}
if(a.charAt(0)!='-'&&b.charAt(0)=='-')
{
b = b.substring(1);
flag = false;
}
if(!flag)System.out.print("-");
//注意:这里直接将数字计算后的结果相加起来了直接得到最后一行
int[] s = new int[b.length()+a.length()];
for (int i = b.length()-1; i >= 0; i--) {
for (int k = a.length()-1; k >= 0; k--) {
int t = (b.charAt(i)-'0')*(a.charAt(k)-'0');
s[s.length-1-(a.length()-1-k+(b.length()-1-i))] += t;
}
}
//进位计算
for(int i=s.length-1;i>0;i--)
{
if(s[i]>=10){
s[i-1] +=s[i]/10;
s[i]=s[i]%10;
}
}
//清空前置零(int转向StringBuffer的时候可能会多0),并使用字符串表示出答案
StringBuffer ans = new StringBuffer();
for (int i : s) {
ans.append(i);
}
while(ans.charAt(0)=='0'){
ans.deleteCharAt(0);
}
System.out.println(ans);
sc.close();
}
}
最后:bugs:
在初步形成之后,还是有一些bug的比如乘数中含有0,那么就会报错。
所以要排除这一情况。(在判断符号前加入一个判断0即可)
代码:
//大数乘法
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String a = sc.nextLine();
String b = sc.nextLine();
System.out.print(a+" * "+b+" = ");
//判断0
if(a.equals("0")||b.equals("0"))System.out.println("0");
else {
//判断符号
Boolean flag = true;
if(a.charAt(0)=='-'&&b.charAt(0)=='-')
{
a = a.substring(1);
b = b.substring(1);
flag = true;
}
if(a.charAt(0)!='-'&&b.charAt(0)!='-'){
flag = true;
}
if(a.charAt(0)=='-'&&b.charAt(0)!='-')
{
a = a.substring(1);
flag = false;
}
if(a.charAt(0)!='-'&&b.charAt(0)=='-')
{
b = b.substring(1);
flag = false;
}
if(!flag)System.out.print("-");
//注意:这里直接将数字计算后的结果相加起来了直接得到最后一行
int[] s = new int[b.length()+a.length()];
for (int i = b.length()-1; i >= 0; i--) {
for (int k = a.length()-1; k >= 0; k--) {
int t = (b.charAt(i)-'0')*(a.charAt(k)-'0');
s[s.length-1-(a.length()-1-k+(b.length()-1-i))] += t;
}
}
//进位计算
for(int i=s.length-1;i>0;i--)
{
if(s[i]>=10){
s[i-1] +=s[i]/10;
s[i]=s[i]%10;
}
}
//清空前置零(int转向StringBuffer的时候可能会多0),并使用字符串表示出答案
StringBuffer ans = new StringBuffer();
for (int i : s) {
ans.append(i);
}
while(ans.charAt(0)=='0'){
ans.deleteCharAt(0);
}
System.out.println(ans);
sc.close();
}
}
}