关于大整数的加减乘除求余运算 java

自己用java 实现了大字符串整数的加减乘除和求余运算,

加减法的算法是模拟手工笔算的计算过程,

除法就是从最高位不停的减操作,

乘法的算法 :遍历一个数的各个位数以及他所在位置,另一个数根据这个数的位置末位添n个0,然后累加次数为这个位置数的数值

原创代码如下:

public class Demo6 {
    public static void main(String[]args){
        System.out.println(add("-989","989"));
        System.out.println(sub("890","-235"));
        System.out.println(divide("-21","22"));
        System.out.println(mtp("-123","4567"));
        System.out.println(remainder("22","21"));
    }
    
    public static String add(String s1,String s2){
        StringBuffer res=new StringBuffer();
        if(s1.contains("-")&&s2.contains("-")){
            res.append("-");
            s1=s1.replace("-", "");
            s2=s2.replace("-", "");
        }else if((!s1.contains("-")&&s2.contains("-"))){
            return sub(s1,s2.replace("-", ""));
        }else if((s1.contains("-")&&!s2.contains("-"))){
            return sub(s2,s1.replace("-", ""));
        }
        
        int len =Math.abs(s1.length()-s2.length());
        if(s1.length()>s2.length()){
            s2=castSame(s2,len);
        }else{
            s1=castSame(s1,len);
        }
        int n=0;
        for(int i=s1.length()-1;i>=0;i--){
            int temp = (s1.charAt(i)-'0'+s2.charAt(i)-'0'+n);
            if(i==0){
                res.append(temp%10).append(temp/10==0?"":temp/10);
            }else{
                res.append(temp%10);
                n=temp/10;
            }    
        }
        return kickZero(String.valueOf(res.reverse()));
        
    }
    
    public static String sub(String s1,String s2){
        boolean flag = false;
        StringBuffer res=new StringBuffer();
        if(s1.contains("-")&&s2.contains("-")){
            return sub(s2.replace("-", ""),s1.replace("-", ""));
        
        }else if((!s1.contains("-")&&s2.contains("-"))){
            return add(s1,s2.replace("-", ""));
        }else if((s1.contains("-")&&!s2.contains("-"))){
            return "-"+add(s2,s1.replace("-", ""));
        }
        
        if(!isGreater(s1,s2)){
            flag = true;
            String temp =s1;
            s1=s2;
            s2=temp;
        }
        s2 = castSame( s2,s1.length()-s2.length());
        int n=0;
        for(int i=s1.length()-1;i>=0;i--){
            Integer temp = s1.charAt(i)-'0'-s2.charAt(i)+'0'-n;
            
            temp = i==0?(temp==0?null:temp):temp;
            res.append(temp==null?"":temp>=0?temp:temp+10);
            
            n=temp==null?0:temp<0?1:0;
            
        }
        return kickZero(flag?String.valueOf(res.append("-").reverse()):String.valueOf(res.reverse()));    
    }
    
    public static String divide(String s1,String s2){
        StringBuffer res = new StringBuffer();
        int c=0;
        if(s1.contains("-")){
            s1=s1.replace("-", "");
            c++;
        }
        if(s2.contains("-")){
            s2=s2.replace("-", "");
            c++;
        }
        if(c==1)
            res.append("-");
        if("0".equals(s2)){
            return "ERROR";
        }
        if(!isGreater(s1,s2)){
            return "0";
        }
        
        int n=s2.length();
        String temp=s1.substring(0,n);
        while(true){
            int count=0;
            while(sub(temp,s2).contains("-")){
                temp +=s1.charAt(n);
                n++;
            }
            while(true){
                count++;
                temp=sub(temp,s2);
                if(sub(temp,s2).contains("-")){
                    break;
                }
            }
            res.append(count);
            if(n>=s1.length()){
                return String.valueOf(res);    
            }    
        }    
    }
    
    public static String mtp(String s1,String s2){
        String res = "";
        int c=0;
        if(s1.contains("-")){
            s1=s1.replace("-", "");
            c++;
        }
        if(s2.contains("-")){
            s2=s2.replace("-", "");
            c++;
        }
        if(!isGreater(s1,s2)){
            String t =s1;
            s1=s2;
            s2=t;
        }
        String temp = s1;
        for(int i=s2.length()-1;i>=0;i--){
            
            for(int j=0;j<s2.charAt(i)-'0';j++){
                res= add(res,temp);
            }
            temp=String.valueOf(new StringBuffer(temp).append("0"));
        }
        return c==1?"-"+res:res;
    } 
    
    public static String  remainder(String s1,String s2){
        if("0".equals(s2)){
            return "ERROR";
        }
        if(!isGreater(s1,s2)){
            return s1;
        }
        StringBuffer res = new StringBuffer();
        int n=s2.length();
        String temp=s1.substring(0,n);
        while(true){
            int count=0;
            System.out.println("n:"+n);
            while(sub(temp,s2).contains("-")){
                temp +=s1.charAt(n);
                n++;
            }
            while(true){
                count++;
                temp=sub(temp,s2);
                if(sub(temp,s2).contains("-")){
                    break;
                }
            }
            res.append(count);
            if(n>=s1.length()){
                return temp;    
            }    
        }    
    }
    
    
    public static boolean isGreater(String s1,String s2){//890  235
        
        if(s1.length()>s2.length()){
            return true;
        }else if(s1.length()<s2.length()){
            return false;
        }else if(s1.length()==s2.length()){
            int i=0;
            while(i<s1.length()){
                if(s1.charAt(i)<s2.charAt(i)){
                    return false;
                }else if(s1.charAt(i)>s2.charAt(i)){
                    return true;
                }
                i++;
            }
        }
        return true;
        
    }
    
    public static String castSame(String s,int len){
        StringBuffer sb =new StringBuffer();
        for(int i=0;i<len;i++){
            sb.append("0");
        }
        s=String.valueOf(sb.append(s));
        return s;    
    }
    
    public static String kickZero(String s){
        int i=0;
        while(s.length()>1){
            if('0'==s.charAt(0)){
                s=s.substring(1);
            }else{
                break;
            }
        }
        return s;
        
    }
}

我比较懒,没加注释,如有不明白欢迎提问,方法比较笨,见笑了!

posted on 2014-08-05 17:58  asonga  阅读(2852)  评论(0编辑  收藏  举报

导航