import java.util.Scanner;
/*大数乘法
题目描述
对于32位字长的机器,大约超过20亿,用int类型就无法表示了,我们可以选择long类型,它可以支持完整表达19位长的数字,但无论怎样扩展,固定的整数类型总是有表达的极限!如果对超级大的整数进行精确运算呢?所以,我们不可避免的需要设计高精度计算算法。
下面,请你来计算一些乘法吧。
输入描述
输入数据为一行,共含有两个正整数m和n,中间用空格分隔。注意,m和n均不会达到一亿亿(即一兆,13位整数),也就是说,m和n最多都是12位的正数。
输出描述
请你输出m和n的乘积,只给出数字就好,不要有任何附带的字符哦。
输入样例
100 9
输出样例
900
*/
public class dashu
{
public static void main(String[] args)
{
//两个12位数字相乘,乘积最多24位,6个数字存储即可
long[] a = new long[6];
int i;
Scanner sc=new Scanner(System.in);
// 输入m和n,调用bigmul方法计算乘积
bigmul(sc.nextLong(), sc.nextLong(), a);
// 计算完毕,控制输出
for (i = 0; i < 6; i++)
{
if (a[i] != 0)
{
System.out.print(a[i]);
break;
}
}
if(i==6)
{
System.out.print(0);
}
for (i=0; i < 6; i++)
{
System.out.print(String.format("%04d", a[i]));
}
}
public static void bigmul(long x, long y, long r[])
{
// 以四位为基础分块
int base = 10000;
// 对m和n按照四位分块。
long x1 = x % base;
x /= base;
long x2 = x % base;
x /= base;
long x3 = x;
long y1 = y % base;
y /= base;
long y2 = y % base;
y /= base;
long y3 = y;
// 按照分块乘法相乘之后存入m1-m9
long m1 = y1 * x1;
long m2 = y1 * x2;
long m3 = y1 * x3;
long m4 = y2 * x1;
long m5 = y2 * x2;
long m6 = y2 * x3;
long m7 = y3 * x1;
long m8 = y3 * x2;
long m9 = y3 * x3;
// 对m1-m9按照实际的位数累加,存入r[0]-r[5]
r[5] = m1 % base;
r[4] = m1 / base + m2 % base + m4 % base;
r[3] = m2 / base + m3 % base + m4 / base + m5 % base + m7 % base;
r[2] = m3 / base + m5 / base + m6 % base + m7 / base + m8 % base;
r[1] = m6 / base + m8 / base + m9 % base;
r[0] = m9 / base;
// 对于相加时可能超出4位表示的,需要操作进位
r[3] += r[4] / base;
r[4] = r[4] % base;
r[2] += r[3] / base;
r[3] = r[3] % base;
r[1] += r[2] / base;
r[2] = r[2] % base;
r[0] += r[1] / base;
r[1] = r[1] % base;
}
}