package recursion;
/**
* 大数相乘思想:
* 0 1 2 3 4 5 6 7 8 9 10 11
* 个 十 百 千 万 十万 百万 ……
* 0 = 0 * 0 ;
* 1 = 1 * 0 + 0 * 1 + 0*0的进位
* 2 = 1 * 1 + 0 * 2 + 2 * 0 + 1对应的进位
* ……= ……
* @author my
*
*/
public class BigMultiply {
public static void main(String[] args) {
String str1 ="2342466546456";
String str2 = "5364576545645464";
int len1= str1.length();
int len2= str2.length();
char[] s1 = str1.toCharArray();
char[] s2 = str2.toCharArray();
//高低位对调
coverdata(s1,len1);
coverdata(s2,len2);
System.out.println("乘数:"+ str1);
System.out.println("乘数:"+ str2);
multiply(s1,len1,s2,len2);
}
private static void multiply(char[] a, int alen, char[] b, int blen) {
//两个数乘积位数不会超过乘数位数的和 +3位
int csize = alen +blen +3;
//开辟乘积的数组
int [] c = new int[csize];
//对齐诸位相乘
for(int j =0;j<blen;j++) {
for(int i =0;i<alen;i++) {
c[i+j] += Integer.parseInt(String.valueOf(a[i]))*Integer.parseInt(String.valueOf(b[j]));
}
}
//进位处理
int m = 0;
for(m = 0; m<csize;m++) {
int carray = c[m] /10;
c[m] = c[m] %10;
if(carray>0) {
c[m+1] += carray;
}
}
//找到最高位
for(m = csize-1;m>=0;m--) {
if(c[m]>0)break;
}
System.out.println("乘积为:");
for(int n = 0;n<=m;n++) {
System.out.print(c[m-n]);
}
System.out.println("");
}
private static void coverdata(char[]data, int len) {
//高低位对调
for(int i=0;i<len/2;i++) {
/**
* a = a+b;
* b = a - b;
* a = a - b;
*/
data[i] += data[len -1 -i];
data[len -1 -i] = (char)(data[i]-data[len-1-i]);
data[i] = (char)(data[i]-data[len-1-i]);
}
}
}
大数相乘
最新推荐文章于 2024-01-20 09:00:00 发布