概述
声明:参考博文http://blog.csdn.net/sunkun2013/article/details/11833515
最后的思想实现的大数相除,以便自己以后查阅学习,此博主给出的详细图解,参考最后一种思想实现;现给出源代码;
此思想将大数的除法转化为大数的乘法和加法运算,
比如800/7=114,余2;则
- 将被除数800和除数7通过补零的方式使其位数相同,即800/700;
- 如果补零后被除数<除数(即如果800<700),则给被除数补一个零,否则进行下一步运算;
- 循环找出 除数i(i数0~9之间的数)的结果小于被除数的最大i值,即7001=700<800<700*2=1400,此时找到的i=1;找到的i即为商的最高位数;
- 用被除数减去上述乘数结果作为下一轮的被除数;即800-700*1=100;
- 重复上述步骤,直到余数小于原始被除数为真结束;比如上述例子的长度只差为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代码实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复