您的位置:首页 > 编程语言 > Java开发

大数的四则运算之除法----Java代码实现

2017-08-04 18:43 531 查看
声明:参考博文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值,即700*1=700<800<700*2=1400,此时找到的i=1;找到的i即为商的最高位数;

4. 用被除数减去上述乘数结果作为下一轮的被除数;即800-700*1=100;

5. 重复上述步骤,直到原始被除数和除数的长度只差等于0;比如上述例子的长度只差为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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: