我是靠谱客的博主 自由铅笔,最近开发中收集的这篇文章主要介绍大数的四则运算之除法----Java代码实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

声明:参考博文http://blog.csdn.net/sunkun2013/article/details/11833515
最后的思想实现的大数相除,以便自己以后查阅学习,此博主给出的详细图解,参考最后一种思想实现;现给出源代码;

此思想将大数的除法转化为大数的乘法和加法运算
比如800/7=114,余2;则

  1. 将被除数800和除数7通过补零的方式使其位数相同,即800/700;
  2. 如果补零后被除数<除数(即如果800<700),则给被除数补一个零,否则进行下一步运算;
  3. 循环找出 除数i(i数0~9之间的数)的结果小于被除数的最大i值,即7001=700<800<700*2=1400,此时找到的i=1;找到的i即为商的最高位数;
  4. 用被除数减去上述乘数结果作为下一轮的被除数;即800-700*1=100;
  5. 重复上述步骤,直到余数小于原始被除数为真结束;比如上述例子的长度只差为3-1=2,则此结果循环两次;
    上述步骤是针对被除数比除数大的情况,其他情况比较简单,不予赘述;
    Java实现大数相除代码
	/**
	 * 两个大正数相除
	 * @param num1
	 * @param num2
	 * @return
	 */
	public static String bigPositiveDiv(String num1,String num2) {
		String result = "";
		int len = num1.length() - num2.length();
		//num1 < num2
		if (len < 0) {
			result = "0";
		}else if (len == 0 && compare(num1, num2)==0) {
			result = "1";
		}else {
			//主要处理num1 》 num2的情况
			while (len > 0) {
				//除数补零操作
				while(num1.length() > num2.length()){
					num2 = num2 + "0";
				}
				if (compare(num1, num2) < 0) {
					num1 = num1 + "0";
				}
				
				//处理补零操作后被除数和除数相等的情况,如果相等,则最高位为1,其后补被除数和除数长度之差,即len个零;
				if (compare(num1, num2) == 0 && result.equals("")) {
					result = "1";
				}
                
				for (int i = 9; i > 0; i--) {
					String mulr = multiply(num2, String.valueOf(i));
					if (compare(mulr,num1) < 0) {
						num1 = subPositiveNum(num1, mulr);
						result += i;
                        i = 0;
					}
					if (i == 1) {
						result += "0";
					}
				}
				len--;
			}
		}
		
		System.out.println(result);
		return result;
	}

比较两个大整数字符串值得大小

/**
	 * 比较两个大正数字符串值得大小
	 * @param data1
	 * @param data2
	 * @return
	 */
	public static int compare(String data1,String data2){
		if (data1.length() < data2.length()) {
			return -1;
		}else if (data1.length() > data2.length()) {
			return 1;
		}else{
			if (data1.compareTo(data2) > 0) {
				 return 1;
			}else if(data1.compareTo(data2) < 0){
				 return -1;
			}else {
				 return 0;
			}
		}
	}

上述方法中用到的大数相乘的方法,注:上述用到时两个字符串均为无符号的;

/**
	 * 两个相乘
	 * @param str1
	 * @param str2
	 * @return
	 */
	public static String multiply(String str1,String str2) {	
		//2.加减乘除方法前都会计算这几个参数
		int len1 = str1.length();
		int len2 = str2.length();
		char[] ch1 = str1.toCharArray();
		char[] ch2 = str2.toCharArray();
		//1.构造各位乘数的二维数组
		int[][] temp = new int[len1][len2];
		for (int i = 0; i < len1; i++) {
			for (int j = 0; j < len2; j++) {
		        int c1 = Integer.parseInt(String.valueOf(ch1[i]));
		        int c2 = Integer.parseInt(String.valueOf(ch2[j]));
				temp[i][j] = c1*c2;
			}
		}
		
		//2.计算算术和,不考虑进位
		int[] r = new int[len1+len2-1];   //保存错位相加的数字
		for (int k = 0; k < r.length; k++) {
			for (int i = 0; i < len1; i++) {
				for (int j = 0; j < len2; j++) {
					if (i+j == k) {   //重点:和计算条件
						r[k] += temp[i][j];
					}
				}
			}
		}
		
		//处理进位问题:保留各位,十位进位相加
		for (int k = r.length-1; k > 0; k--) {
			if (r[k] > 9) {
				r[k-1] = r[k]/10+r[k-1];
				r[k] = r[k]%10;
			}
		}
		StringBuffer str = new StringBuffer();
		for (int k = 0; k < r.length; k++) {
			str.append(r[k]);
		}
		
		return str.toString();
	}

上述方法中用到的大数相减的方法

/**
	 * 两个正整数相减,且num1>num2
	 * @param num1
	 * @param num2
	 * @param isPositive
	 * @return
	 */
	public static String subPositiveNum(String num1,String num2) {	
		int tag = 0;
		int sub = 0;
		StringBuffer str = new StringBuffer(" ");
		int i = num1.length()-1;
		int j = num2.length()-1;
		while (i >= 0 && j >= 0) {
			sub = (num1.charAt(i) - '0')-(num2.charAt(j)-'0')+tag;
			if (sub < 0) {
				tag = -1;
				sub = 10 + sub;	
			}else {
				tag = 0;
			}
			str.insert(1, sub);
			i--;j--;
		}
		
		while (i > 0) {
			if (tag < 0) {
				sub = (num1.charAt(i) - '0')+tag;
				if (sub < 0) {
					tag = -1;
					sub = sub + 10;
				}else {
					tag = 0;
				}
				str.insert(1, sub);
				i--;
			} else {
				sub = num1.charAt(i) - '0';
				str.insert(1, sub);
				i--;
			}
		}		
		System.out.println("sub"+str);
		return str.toString().trim();
}

除数符号位以及除数是否为零的处理操作如下:

public static String divide(String num1,String num2){
		int i = 0,j = 0, x = 0,y = 0;
		String result = "";
		//去掉前面的符号位
		if (num1.charAt(0) == '-') {
			num1 = num1.substring(1);
			x++;
		}
		if (num2.charAt(0) == '-') {
			num2 = num2.substring(1);
			y++;
		}
		//去掉大数前面的无效数字
		while (num1.charAt(i) == '0' && i < num1.length()-1) {
			i++;
		}
		num1 = num1.substring(i);
		
		while (num2.charAt(j) == '0' && j < num2.length()-1) {
			j++;
		}
		num2 = num2.substring(j);		
		
		//判断除数是否为0
		if (isZero(num2)) {
			  System.out.println("除数不能为0,请重新输入!");  
              System.exit(-1);
		}else {
			result = bigPositiveDiv(num1, num2);		
		}
		
		if (x+y == 1) {
			result = "-"+ result;
		}
		
		return result;
	}

判断一个数是否为0;

	public static boolean isZero(String data){
		if (data.charAt(0) != '0') {
			return false;
		}
		return true;
	}

最后

以上就是自由铅笔为你收集整理的大数的四则运算之除法----Java代码实现的全部内容,希望文章能够帮你解决大数的四则运算之除法----Java代码实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部