字符串相乘成功测试
采用一个ans数组来存放每列相加的结果,但先不进位,最后一起进位;因为两数相乘,位数最多为两数位数相加,因此数组的长度定义为:
int s1 = x.length; int s2 = y.length;
int []ans = new int[s1+s2];
然后相乘
for(int i = 0 ; i < s1 ; i ++){
for(int j = 0; j < s2 ; j ++){
ans[i+j]+=(x[i]-'0')*(y[j]-'0');
}
}
整体程序如下:
import java.util.Scanner;
/**
* 实现两个字符串相乘
* 字符串长度<110
* 输出为字符串长度
* */
public class BigInterger {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String a = scanner.nextLine();
String b = scanner.nextLine();
if(a.length()>110||b.length()>110){
System.out.println("false");
}
String output = new BigInterger().amp(a,b);
System.out.println(output);
}
public String amp(String a, String b){
/*int start1 = 0,start2 = 0; // 第一个踩坑点,要防止开始数据020/060,这些数据
if(!('1'<=a.charAt(0)&&a.charAt(0)<='9')){
start1 = a.indexOf('0')+1; // 第二个踩坑点,start的起始位置要注意
}
if(!('1'<=a.charAt(0)&&a.charAt(0)<='9')){
start2 = b.indexOf('0')+1;
}*/
StringBuffer aa = new StringBuffer(a);
StringBuffer bb = new StringBuffer(b);
char [] x = aa.reverse().toString().toCharArray();
char [] y = bb.reverse().toString().toCharArray();
//System.out.println(x);
String output = "";
int s1 = x.length; int s2 = y.length;
int []ans = new int[s1+s2];
for(int i = 0 ; i < s1 ; i ++){
for(int j = 0; j < s2 ; j ++){
ans[i+j]+=(x[i]-'0')*(y[j]-'0');
}
}
for(int i = 0; i < s1+s2 - 1; i ++){
//System.out.println(ans[i]);
if(ans[i]>9) {
ans[i + 1] = (ans[i + 1] + ans[i] / 10);
ans[i]=ans[i]%10;
}
//System.out.println(ans[i]);
}
int pos = ans[s1+s2 - 1]== 0 ? s1 + s2 - 2 : s1 + s2 - 1; // 第三个踩坑点,最高位为0就不要输出了
boolean flag = true; //用标记位来判断最高位不为零的输出
for(int i = pos ; i >= 0 ; i --) {
//System.out.println(ans[pos]);
if(flag&&ans[i]==0){
continue;
}
flag = false;
output += (char)(ans[i] + '0');
//System.out.println((char)ans[pos]);
}
return output;
}
}
运行结果: