加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

大数相减

发布时间:2020-12-14 02:21:34 所属栏目:大数据 来源:网络整理
导读:题目描述: ?输入:两个正的大数 输出:两个大数的差 代码实现: import java.util.ArrayList;import java.util.List;import java.util.Scanner;/** * @author njupt * 两个正大数相减 */public class BigNumSub {public static void main(String[] args) {S

题目描述:

?输入:两个正的大数

输出:两个大数的差

代码实现:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @author njupt
 * 两个正大数相减
 */
public class BigNumSub {

	public static void main(String[] args) {
		Scanner cin=new Scanner(System.in);
		String minuend;//被减数
		String meiosis;//减数
		String difference;//差值
		while(cin.hasNext()){
			minuend=cin.next();
			meiosis=cin.next();
			if(!valid(minuend)||!valid(meiosis))//合法性验证
				return;
			difference=bigNumSub(minuend,meiosis);
			System.out.println(difference);
		}
	}

	
	/**
	 * @param minuend 被减数
	 * @param meiosis 减数
	 * @return difference 差值
	 * 
	 * 1.判断被减数和减数的大小
	 * (1):被减数minuend的位数大于meiosis减数的位数,则直接相减
	 * (2):被减数minuend的位数小于meiosis减数的位数,交换相减,结果加上-(负号)
	 * (3):被减数minuend的位数等于meiosis减数的位数,判断两者的大小:
	 *     a:minuend>=meiosis,则直接相减
	 *     b:minuend<meiosis,交换相减,结果加上-(负号)
	 */
	private static String bigNumSub(String minuend,String meiosis) {
	
		int minLen=minuend.length();//被减数的长度
		int meiLen=meiosis.length();//减数的长度
		boolean addSign=false;//是否交换被减数和减数
		String difference;//结果
        if(minLen<meiLen){
			addSign=true;
			String temp=minuend;
			minuend=meiosis;
			meiosis=temp;
		}else if(minLen==meiLen){//两个位数相等
			//判断大小
			int re=judge(minuend,meiosis);
			if(re==-1)//小于,要交换
			{
				addSign=true;
				String temp=minuend;
				minuend=meiosis;
				meiosis=temp;
			}else if(re==0){
				return "0";
			}
		}
		//相减
		difference=sub(minuend,meiosis);
		if(addSign)
			return "-"+difference;
		
		return difference;
	}

	/**
	 * @param minuend
	 * @param meiosis
	 * @return difference
	 * 两个大数相减,这里按照数学上的大小已经是被减数minuend>=meiosis
	 */
	private static String sub(String minuend,String meiosis) {
		int minLen=minuend.length();//被减数的长度
		int meiLen=meiosis.length();//减数的长度
		int dif=minLen-meiLen;//两个数的相差几位
		boolean borrow=false;//借位
		List<Integer> list=new ArrayList<Integer>();//放置每位相减的结果
		int i=meiLen-1;
		int j=i+dif;
		int min=0;
		int mei=0;
		for (; i >=0; j--,i--) {
			min=Integer.valueOf(minuend.charAt(j))-48;
			mei=Integer.valueOf(meiosis.charAt(i))-48;
			int result=0;
			
			if(borrow){//有借位情况
				min=min-1;
			}
			if(min>=mei){
				result=min-mei;
			}else{//需要借位
				result=min+10-mei;
				borrow=true;
			}
			list.add(result);
		}
		//将剩余的的被减数的位记录下来
		for (; j>=0; j--) {
			min=Integer.valueOf(minuend.charAt(j))-48;
			if(borrow){//上一次有借位
				min=min-1;
				borrow=false;
			}
			list.add(min);
		}
		StringBuilder sb=new StringBuilder();
		//这里注意把去掉前面的零位
		boolean remove=true;
		for (int k=list.size()-1;k>=0;k--) {
			int re=list.get(k);
			if(re!=0||remove==false){
				sb.append(re);
				remove=false;
			}
		}
		return sb.toString();
	}


	/**
	 * @param minuend
	 * @param meiosis
	 * @return result
	 * 判断两个等位数大数在数学意义上的大小关系
	 */
	private static int judge(String minuend,String meiosis) {
		int result=0;//默认被减数大于减数
		int len=minuend.length();
		int i=0;
		for(;i<len;i++){
			if(minuend.charAt(i)>meiosis.charAt(i)){//大于
				result=1;
				return result;
			}else if(minuend.charAt(i)<meiosis.charAt(i)){//小于
				result=-1;
				return result;
			}
		}
		return result;
	}


	//输入合法性验证
	private static boolean valid(String number) {
		if(null==number&&"".equals(number))
			return false;
		char[] charArr=number.toCharArray();
		if(charArr[0]=='0')//首字符不能为0
			return false;
		for (int i = 1; i < charArr.length; i++) {//每个字符介于0到9
			char temp=charArr[i];
			if(temp<'0'||temp>'9')
				return false;
		}
		return true;
	}

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读