大整数运算包的实现(Java)(1) --加、减、乘、除、模取余、模加(考虑负数)

下一篇博客---->大整数运算包的实现(Java)(2) --快速幂取模、最大公约数、乘法逆元、素数判定、生成大素数

一、大数加法

   /**
	 * 大数加法
	 * @param one  加数
	 * @param two  加数
	 * @return     结果
	 */
	public static String Add(String one,String two) {
   
		if(one.equals("0"))   //加数中的其中一个为0则直接返回另一个
			return two;
		if(two.equals("0"))
			return one;
		int length1=one.length();   //获取长度
		int length2=two.length();
		char[] Long=null,Short=null;
		int i,max=0,min=0,carry=0,num1,num2,front1=0,front2=0,isNegative1=0,isNegative2=0,oneLong=0;
		if(one.charAt(0)=='-') {
      //第一个数是负数
			isNegative1=1;   //标记
			front1++;   //前驱,去掉负号
			length1--;   //长度减1
		}
		if(two.charAt(0)=='-') {
   
			isNegative2=1;
			front2++;
			length2--;
		}
		if(length1>length2) {
      //将数值大的数放到Long[],数值小的数放到Short[],方便操作
			max=one.length();   //指向数值大的数的最低位
			min=two.length();   //指向数值小的数的最低位
			Long=one.toCharArray();
			Short=two.toCharArray();
			oneLong=1;   //第一个数大
		}
		else if(length1<length2){
   
			max=two.length();
			min=one.length();
			Long=two.toCharArray();
			Short=one.toCharArray();
		}
		else {
      //数值长度相等
			int j,k;
			for(j=front1,k=front2;j<one.length();j++,k++) {
   
				if(one.charAt(j)>two.charAt(k)) {
      //第一个数大
					max=one.length();
					min=two.length();
					Long=one.toCharArray();
					Short=two.toCharArray();
					oneLong=1;
					break;
				}else if(one.charAt(j)<two.charAt(k)){
   
					max=two.length();
					min=one.length();
					Long=two.toCharArray();
					Short=one.toCharArray();
					break;
				}
			}
			if(j==one.length()) {
      //两个数的数值相等
				if(isNegative1==isNegative2) {
      //符号相等
					max=one.length();
					min=two.length();
					Long=one.toCharArray();
					Short=two.toCharArray();
				}else {
      //两个数的数值相等,符号不同,正数+负数=0
					//System.out.println("Add result=0");
					return "0"; 
				}  
			}
		}
		int[] result=new int[length1>length2?length1+1:length2+1];   //可能有进位
		String number="";
		if(isNegative1==isNegative2) {
      //符号相等,无论是正数+正数还是负数+负数,都是数值相加再加符号
			for(i=0;min>front1;i++) {
      //front1=front2
				num1=Long[--max]-48;
				num2=Short[--min]-48;
				result[i]=(num1+num2+carry)%10;
				carry=(num1+num2+carry)/10;
			}
			while (max>front1) {
      //剩下的继续加
				num1=Long[--max]-48;
				result[i++]=(num1+carry)%10;
				carry=(num1+carry)/10;
			}
			if(carry==1)   //最高位有进位
				result[i]=1;
			if(isNegative1==1)   //负数
				number+='-';
			if(result[i]!=0)
				number+=String.valueOf(result[i--]);
			else
				i--;   //如果首位是0则跳过
			for(;i>=0;i--)   //转化为字符串
				number+=String.valueOf(result[i]);
		}else {
      //符号不同,正数数值大结果为正数,负数数值大结果为负数
			if(oneLong==1) {
   
				length1=front2;
				length2=front1;
				if(isNegative1==1)
					number+="-";
			}else {
   
				length1=front1;
				length2=front2;
				if(isNegative2==1)
					number+="-";
			}
			for(i=0;min>length1;i++) {
      //减法
				num1=Long[--max]-48;
				num2=Short[--min]-48;
				result[i]=(num1-num2+10+carry)%10;
				if(num1-num2+carry<0)
					carry=-1;
				else
					carry
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值