大数相加

大数相加的实现

Posted by Wengdada on March 17, 2017

这是一道面试题目,要求实现大数相加,具体要求如下:请编写一个函数实现两个数字字符串进行十进制加法操作,如果出错返回error。 格式如下: add(“9”,”1”),输出结果为10 add(“-10”,”11”),输出结果为1 add(“-0”,”+0”),输出结果为0 add(“-0”,”-0”),输出结果为0 add(“000”,”1”),输出结果为error,如果为0只能输入0,+0,-0 add(“a”,”1”),输出结果为error

代码如下:

package main;
import java.io.IOException;
import java.util.Scanner;

//总体思想:
//先用正则表达式判断输入的格式是否正确
//若同号,去符号位后进行长度对齐再进行加法,注意同号中的-0,-0结果不需要显示负号
//若异号,去符号位后进行长度对齐再进行减法,注意判断去符号后的两个数是否相同,相同结果为0

public class add {
    //正则表达式检查输入的格式
    //若以(正负号可有可无)1-9开头的长度不限的字符串
    //或者以(正负号可有可无)1个0的字符串都符合要求.
    public static String regex="^[+-]?[1-9][0-9]*$|^[+-]?0$";
    public static boolean Negative = false;
    public static boolean Positive = true;
    public add() {}
    
    public static void add(String num1,String num2){
        
        char Array1[]=num1.toCharArray();
        char Array2[]=num2.toCharArray();
        
        //假设两个数字都为正数
        boolean flagNegOrPos_num1=Positive;
        boolean flagNegOrPos_num2=Positive;
        boolean flag_result_zero=false;
        
        if(num1.matches(regex)&&num2.matches(regex)){
            if(Array1[0]=='-'){
                flagNegOrPos_num1 = Negative;
            }
            if(Array2[0]=='-'){
                flagNegOrPos_num2 = Negative;
            }
            //若同号,做加法,最后算符号
            if((flagNegOrPos_num1&&flagNegOrPos_num2)||(!flagNegOrPos_num1&&!flagNegOrPos_num2)){
                
                if(flagNegOrPos_num1==Negative){//均为负数
                    
                    num1=num1.substring(1);//去掉负号
                    num2=num2.substring(1);//去掉负号
                    Array1=num1.toCharArray();
                    Array2=num2.toCharArray();
                }
                else{//均为正数,若存在正号,去掉
                    if(Array1[0]=='+'){
                        num1=num1.substring(1);
                        Array1=num1.toCharArray();
                    }
                    if(Array2[0]=='+'){
                        num2=num2.substring(1);
                        Array2=num2.toCharArray();
                    }
                        
                }

                //开始做加法,首先同一规格,让短的数组和长的数组有相同的位数
                char num_expand[];//存储扩展后的数组
                char num_copy[];//存储不需要扩展的数组
                
                int size=0;
                int i,j=0;
                
                //第一个数组比较长,num_copy为第一个数组,num_expand为第二个数组
                if(Array1.length>Array2.length){
                    
                    num_copy=Array1;
                    size=Array1.length;
                    num_expand=new char[size];
                    
                    for(i=0;i<size;i++){
                        num_expand[i]='0';
                    }
                    for(i=size-Array2.length,j=0;i<size;){
                        num_expand[i++]=Array2[j++];
                    }
                    
                }else{//第二个数组比较长,num_copy为第二个数组,num_expand为第一个数组
                    num_copy=Array2;
                    size=Array2.length;
                    num_expand=new char[size];
                    
                    for(i=0;i<size;i++){
                        num_expand[i]='0';
                    }
                    for(i=size-Array1.length,j=0;i<size;){
                        num_expand[i++]=Array1[j++];
                    }
                   
                }
  
               boolean carry=false;//进位标志符
               
               char result[]=new char[size+1];//可能最后结果需要进位,所以多一位
               for(i=size-1;i>=0;i--){
                   int temp=0;
                   if(carry){
                       temp++;
                       carry=false;
                   }
                   temp+=num_copy[i]+num_expand[i]-'0'-'0';
                   if(temp>=10){
                       carry=true;
                       temp=temp-10;
                   }
                   
                   result[i+1]=(char)((char)temp+'0');
               }

               int StartPrintBit=1;//是否打印结果数组的首位,即判断结果是否有进位
               if(carry){
                   result[i+1]='1';
                   StartPrintBit=0;
               }
               
               
               if(StartPrintBit==1&&result[1]=='0'){
                   flag_result_zero=true;
               }
               if(!flagNegOrPos_num1&&!flag_result_zero)
                   System.out.print("-");
               for( i=StartPrintBit;i<size+1;i++){
                   System.out.print(result[i]); 
               }
    
            }
    
        else{//若异号,做减法
    
                //确定减数以及被减数
                char []sub1=null;//被减数
                char []sub2=null;//减数
                boolean result_positive=false;
                boolean result_negative=false;
                int i,j;
                
                //num1为负数,num2为正数
                if(flagNegOrPos_num1==Negative){
                    
                    //num1去掉负号,去掉num2'+'号若存在
                    num1=num1.substring(1);
                    Array1=num1.toCharArray();
                    if(Array2[0]=='+'){
                        num2=num2.substring(1);
                        Array2=num2.toCharArray();
                    }
                    sub1=Array2;
                    sub2=Array1;    
                }
                
                //num2为负数,num1为正数
                if(flagNegOrPos_num2==Negative){
                    ////num2去掉负号,去掉num1'+'号若存在
                    num2=num2.substring(1);
                    Array2=num2.toCharArray();
                    if(Array1[0]=='+'){
                        num1=num1.substring(1);
                        Array1=num1.toCharArray();
                    }
                    sub1=Array1;
                    sub2=Array2;
                    
                }
                
                int sub1_size=sub1.length;
                int sub2_size=sub2.length;
                
                //结果判断是否为负数
                if(sub1_size<sub2_size)
                    result_negative=true;
                else if(sub1_size>sub2_size)
                    result_positive=true;
                else {
                    for(i=0;i<sub1_size;i++){
                        int temp=sub1[i]-sub2[i];
                        if(temp>0){
                            result_positive=true;
                            break;
                        }
                        if(temp<0){
                            result_negative=true;
                            break;
                        }
                    }       
                }

                //结果为正数
                if(result_positive){
                    
                    char []positive_result=new char[sub1_size];
                    char []sub2_extend= new char[sub1_size];
                    for(i=0;i<sub1_size;i++){
                        sub2_extend[i]='0';
                    }
                    
                    for(i=sub1_size-sub2_size,j=0;i<sub1_size;i++,j++){
                        sub2_extend[i]=sub2[j];
                    }
                    boolean flag=false;//是否需要借位
                    
                    for(i=sub1_size-1;i>=0;i--){
                        int temp=0;
                        if(flag){
                            temp--;
                            flag=false;
                        }
                        temp+=sub1[i]-sub2_extend[i];
                        if(temp<0){
                            flag=true;
                            temp+=10;
                        }
                        positive_result[i]=(char)(temp+'0');
                    }

                    for(i=0;i<sub1_size;i++){
                        if(positive_result[i]>'0')
                            break;
                    }
                    for(;i<sub1_size;i++){
                        System.out.print(positive_result[i]);
                    }       
                }

                //结果为负数
                if(result_negative){
                    char []negative_result=new char[sub2_size];
                    char []sub1_extend= new char[sub2_size];
                    for(i=0;i<sub2_size;i++){
                        sub1_extend[i]='0';
                    }
                    
                    for(i=sub2_size-sub1_size,j=0;i<sub2_size;i++,j++){
                        sub1_extend[i]=sub1[j];
                    }
                    
                    boolean flag=false;//是否需要借位
                    
                    for(i=sub2_size-1;i>=0;i--){
                        int temp=0;
                        if(flag){
                            temp--;
                            flag=false;
                        }
                        temp+=sub2[i]-sub1_extend[i];
                        
                        if(temp<0){
                            flag=true;
                            temp+=10;
                        }
                        negative_result[i]=(char)(temp+'0');
                    }
                    
                    System.out.print("-");
                    
                    for(i=0;i<sub2_size;i++){
                        if(negative_result[i]>'0')
                            break;
                    }
                    for(;i<sub2_size;i++){
                        System.out.print(negative_result[i]);
                    }
                }
                
                //结果非正非负,为0
                if(!result_negative&&!result_positive){
                    System.out.println("0");
                }
                
            }

        }
        
        
    else{
        System.out.println("wrong");
    }
 }
    
    
    public static void main(String[] args) throws IOException {
        
        
        // TODO Auto-generated method stub
        while(true){
        Scanner reader = new Scanner(System.in);
        String num1=reader.next();
        String num2=reader.next();
        add(num1,num2);
        }
    }
        
}


下面的是正则表达式的入门,可以了解下: 正则表达式30分钟入门教程