关于大整数的加减乘除求余运算 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;

    }
}

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

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

时间: 2024-10-10 07:15:11

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

大整数的求余运算

在加密系统中,长长要求把一行字符看作是一串二进制位,然后对某个固定的数进行求余运算. 解答: #include <stdio.h> int main() { const int K=34943; unsigned int L=0; unsigned char c; unsigned long long test=0b0011001100110100001110010011010000110011; //34943的ascii码 printf("%llu\n",test);

大整数的加减乘除

多项式的加减乘除能够利用多项式的加减乘除进行运算,所以下面程序採用了多项式的加减乘除.多项式运算已经在<算法导论>第30章有简要的介绍,详细的请參考数学书. 大整数加法:(利用书上公式轻松得出) //多项式加法-大数加法 #include <iostream> #include <time.h> using namespace std; #define m1 4 #define m2 5 //a[0]=x^0 a[1]=x^1....a[n]=x^n的关于x的多项式系数

C语言负数的除法和求余运算

假定我们让 a 除以 b,商为 q,余数为 r: q = a / b; r = a % b; 这里,不妨假定 b 大于 0. 我们希望 a.b.q.r 之间维持怎样的关系呢? 1.最重的一点,我们希望 q * b + r == a,因为这是定义余数的关系. 2.如果我们改变 a 的正负号,我们希望这会改变 q 的符号,但这不会改变 q  的绝对值. 3.当 b>0 时,我们希望保证 r >= 0 且 r < b.例如,如果余数用于哈希表的索引,确保 它是一个有效的索引值很重 . 这三条性

[转]取模运算和求余运算的区别

[转]取模运算和求余运算的区别 通常情况下取模运算(mod)和求余(rem)运算被混为一谈,因为在大多数的编程语言里,都用'%'符号表示取模或者求余运算.在这里要提醒大家要十分注意当前环境下'%'运算符的具体意义,因为在有负数存在的情况下,两者的结果是不一样的. 对于整型数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余数: r = a - c*b. 通常常用的是正数之间取模或求余.下面的可以先不关心. —————————————————————

Swift 求余运算

1 求余运算 2 3 求余运算(a % b)是计算b的多少倍刚刚好可以容入a,返回多出来的那部分(余数). 4 注意:求余运算(%)在其他语言也叫取模运算.然而严格说来,我们看该运算符对负数的操作结果,"求余"比"取模"更合适些. 5 我们来谈谈取余是怎么回事,计算9 % 4,你先计算出4的多少倍会刚好可以容入9中: 6 Art/remainderInteger_2x.png 7 2倍,非常好,那余数是1(用橙色标出) 8 9 在 Swift 中这么来表达: 10

java学习日记-基础-随机数组的求余运算

时间是2017年5月6日,青年节刚过,坐标上海,沪漂2个月. 就这样简短地开始吧.                                by:slowcity [案例分析1] 要求定义一个int 型数组a,包含100 个元素,保存100个随机的4 位数.再定义一个int 型数组b,包含10 个元素.统计a 数组中的元素对10 求余等于0 的个数,保存到 b[0]中:对10 求余等于1 的个数,保存到b[1]中,--依此类推 一般看到这类的最基本的思路:1先建立一个含数组存随机四位数 2

大整数的加减乘除C++实现

大整数的乘法由于用分治法理解起来有点困难,就采用人的计算方法实现,大整数为string 类型,结果也为string类型. 大整数的除法采用先乘后减的方法,例如: 665/20 首先20*10=200:然后665去减200,通过循环计入减了3次,则结果记入3*10=30:然后20*1=20,上次减了之后还剩65,65-20,又减了3次,所以结果记入30+3*1=33:最后还剩5,比20小,则余数为5. 大整数的加法减法和人工打草稿过程类似,不做详细分析.实现代码仅供参考: 1 #include<i

115-数学运算符 加减乘除求余

表达式:把变量和字面值和运算符组合起来就是表达式 运算符的分类 一元运算符 处理一个操作数 二元运算符 处理两个操作数 三元运算符 处理三个操作数 数学运算符 除,两个整数相除仍是整数,不能整除则略去小数 取余,小数也可以取余,符号决定于被除数 最后的两个单独的+和-相当于正负数学运算符只能处理数字,除了字符串相加char可以用来做数学运算,因为char变量在内存中实际存储的是数字 原文地址:https://www.cnblogs.com/wuxiaohui1983/p/9965736.html

大整数运算C++1

//下面的代码勉强算是bignum_beta1版本! //实现了大整数的加减乘除四则运算,以及求两个整数的最大公约数,以及求乘法逆,miller_rabin素性检验,平方_乘法算法 //不足之处,位数还很难扩展至几千位,以及运算速度有一点慢,既然是beta1,说明bug还是挺多的 //程序缺少测试数据来测试,所以有的结果不敢保证其正确性 //由于使用c++复写了很多运算符,加入这个文件之后,大数bignum可以看做是一个如同如同int一样的基本类型 //可以像int一样加减乘除和输入输出 #in