在日常笔试的时候经常会遇到这样一类题目,让你写段代码,计算出两个数相乘的结果,而对于第一次接触这种类型题目的同学(就像开始的我),则会很快的按照常规的思路,非常流畅的写完代码,其实不然,这种做法是错误的,因为没有考虑溢出的问题,两个数的位数太多,超出了计算机计算的范围,所以,这里我们就分析一下,如何解决这类题目,本文才用的是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';  
        }  
    }
}