在日常笔试的时候经常会遇到这样一类题目,让你写段代码,计算出两个数相乘的结果,而对于第一次接触这种类型题目的同学(就像开始的我),则会很快的按照常规的思路,非常流畅的写完代码,其实不然,这种做法是错误的,因为没有考虑溢出的问题,两个数的位数太多,超出了计算机计算的范围,所以,这里我们就分析一下,如何解决这类题目,本文才用的是java语言,其实,利用其它的语言编写思路都是一样的。
其实,仔细想想,很简单的,我们可以直接将两个大数据放到两个不同 的数组中去,然后利用乘法的原则进行每位的计算,最后计算的结果,同样也是用数组表示的,输出的时候同样把最终计算的数组每位输出出来即可。下面进行举例说明。
/*
* 大整数乘法
*/
public class Demo9 {
static int N=100;
static int a[]=new int[N];
static int b[]=new int[N];
static int c[]=new int[2*N];
static String s1=new String();
static String s2=new String();
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Demo9 demo=new Demo9();
demo.Input();
demo.Multiply(a, b, c);
demo.Output();
}
private void Output() {
System.out.println("result=");
int flag=2*N-1;
while(c[flag]==0) {
if(flag==0) {
System.out.println("0");
return ;
}
flag--;
}
for(int i=flag;i>=0;i--) {
System.out.print(c[i]);
}
System.out.println("");
}
private void Multiply(int a[],int b[],int c[]) {
//逐个相乘
for(int i=0;i<N;i++) {
for(int j=0;j<N;j++) {
c[i+j]+=a[i]*b[j];
}
}
//移位、进位
for(int i=0;i<2*N-1;i++) {
c[i+1]+=c[i]/10;
c[i]=c[i]%10;
}
}
private void Input() {
Scanner scanner=new Scanner(System.in);
System.out.println("input two big data:");
s1=scanner.nextLine();
s2=scanner.nextLine();
GetDigit(s1, a);
GetDigit(s2, b);
}
private static void GetDigit(String s,int a[]) {
int len=s.length();
for(int i=0;i<len;i++) {
a[len-1-i]=s.charAt(i)-'0';
}
}
}