大数的加减乘除
来源:互联网 发布:js style.border 编辑:程序博客网 时间:2024/06/02 15:09
大数的加减乘除
- package com.test;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- public class BigInt {
- /**
- *
- *
- *
- */
- public static void main(String[] args) throws IOException {
- // TODO Auto-generated method stub
- BufferedReader stdin = new BufferedReader(new InputStreamReader(
- System.in));
- String num1 = "";
- String num2 = "";
- boolean isill = true;// 判断输入的值是否合法
- do {
- System.out.println("输入第一串数字:");
- num1 = stdin.readLine();
- if (num1.length() == 0)// 如果没输入,则提示重新输入
- {
- isill = false;
- System.out.println("输入的数字有误!");
- }
- if (num1.length() == 1)// 如果输入的是1个字符,则必须是0-9数字
- {
- if (num1.matches("[0-9]") == false) {
- isill = false;
- System.out.println("输入的数字有误!");
- }
- }
- else {
- if (num1.matches("[-]*[1-9][0-9]*") == false)// 判断输入的字符串是否是非0开头的数字
- {
- isill = false;
- System.out.println("输入的数字有误!");
- }
- }// end else
- }// end do
- while (isill == false);// 如果输入有误,则继续输入
- do {
- System.out.println("输入第二串数字:");
- num2 = stdin.readLine();
- // System.out.println("num2的长度"+num2.length());
- if (num2.length() == 0)// 如果没输入,则提示重新输入
- {
- isill = false;
- System.out.println("输入的数字有误!");
- // continue;
- }
- if (num2.length() == 1)// 如果输入的是1个字符,则必须是0-9数字
- {
- if (num2.matches("[1-9]") == false) {
- isill = false;
- System.out.println("输入的数字有误!");
- // continue;
- }
- }
- else {
- if (num2.matches("[-]*[1-9][0-9]*") == false)// 判断输入的字符串是否是非0开头的数字
- {
- isill = false;
- System.out.println("输入的数字有误!");
- // continue;
- }
- }
- } while (isill == false);// 如果输入有误,则继续输入
- BigInt bi = new BigInt();
- if (num1.charAt(0) == '-' && num2.charAt(0) != '-')// 如果前者是负数,后者是正数
- {
- System.out.println("两数之和:(" + num1 + ")+(" + num2 + ")="
- + bi.sub(num2, num1.substring(1, num1.length())));// 输出两数相加结果
- System.out.println("两数之差:(" + num1 + ")-(" + num2 + ")=" + "-"
- + bi.add(num1.substring(1, num1.length()), num2));// 输出两数相减结果
- System.out.println("两数之积:(" + num1 + ")*(" + num2 + ")=" + "-"
- + bi.mult(num1.substring(1, num1.length()), num2));// 输出两数相乘结果
- String[] div = bi.div(num1.substring(1, num1.length()), num2);
- System.out.println("两数相除:(" + num1 + ")/(" + num2 + ") 商=" + "-"
- + div[0] + ",余数=" + div[1]);// 输出两数相除结果
- }
- if (num1.charAt(0) != '-' && num2.charAt(0) == '-')// 如果前者是正数,后者是负数
- {
- System.out.println("两数之和:(" + num1 + ")+(" + num2 + ")="
- + bi.sub(num1, num2.substring(1, num2.length())));// 输出两数相加结果
- System.out.println("两数之差:(" + num1 + ")-(" + num2 + ")="
- + bi.add(num1, num2.substring(1, num2.length())));// 输出两数相减结果
- System.out.println("两数之积:(" + num1 + ")*(" + num2 + ")=" + "-"
- + bi.mult(num1, num2.substring(1, num2.length())));// 输出两数相乘结果
- String[] div = bi.div(num1, num2.substring(1, num2.length()));
- System.out.println("两数相除:(" + num1 + ")/(" + num2 + ") 商=" + "-"
- + div[0] + ",余数=" + div[1]);// 输出两数相除结果
- }
- if (num1.charAt(0) == '-' && num2.charAt(0) == '-')// 如果前者是负数,后者是负数
- {
- System.out.println("两数之和:("
- + num1
- + ")+("
- + num2
- + ")="
- + "-"
- + bi.add(num1.substring(1, num1.length()), num2.substring(
- 1, num2.length())));// 输出两数相加结果
- System.out.println("两数之差:("
- + num1
- + ")-("
- + num2
- + ")="
- + bi.sub(num2.substring(1, num2.length()), num1.substring(
- 1, num1.length())));// 输出两数相减结果
- System.out.println("两数之积:("
- + num1
- + ")*("
- + num2
- + ")="
- + bi.mult(num1.substring(1, num1.length()), num2.substring(
- 1, num2.length())));// 输出两数相乘结果
- String[] div = bi.div(num1.substring(1, num1.length()), num2
- .substring(1, num2.length()));
- System.out.println("两数相除:(" + num1 + ")/(" + num2 + ") 商=" + div[0]
- + ",余数=" + div[1]);// 输出两数相除结果
- }
- if (num1.charAt(0) != '-' && num2.charAt(0) != '-')// 全正数
- {
- System.out.println("两数之和:(" + num1 + ")+(" + num2 + ")="
- + bi.add(num1, num2));// 输出两数相加结果
- System.out.println("两数之积:(" + num1 + ")*(" + num2 + ")="
- + bi.mult(num1, num2));// 输出两数相乘结果
- System.out.println("两数之差:(" + num1 + ")-(" + num2 + ")="
- + bi.sub(num1, num2));// 输出两数相减结果
- String[] div = bi.div(num1, num2);
- System.out.println("两数相除:(" + num1 + ")/(" + num2 + ") 商=" + div[0]
- + ",余数=" + div[1]);// 输出两数相除结果
- }
- // System.out.println(num1+" " +num2);
- // System.out.println(bi.split(num1).toString()+bi.split(num2).toString());
- }
- // 统一长度,将返回补了0以后的数组
- String length(String num, int length)// num个数小的字符串,length相差的个数
- {
- String count0 = "";// 需要补0的个数
- for (int i = 0; i < length; i++) {
- count0 += "0";
- }
- return count0 + num;
- }
- // 加运算 num1+num2
- String add(String num1, String num2) {
- // num1 = num1.substring(1);
- if (num1.length() >= num2.length())// 如果第一个字符串比较短,则将它补0
- {
- num2 = length(num2, num1.length() - num2.length());
- }
- else
- num1 = length(num1, num2.length() - num1.length());
- int length = num1.length();// 长度统一以后,取第一个数的长度
- int j, k = 0;// 临时保存两个位上要计数的值
- String result = "";// 结果
- int jinwei = 0;// 保存进位,0表示没进位,1表示进位为1
- for (int i = length - 1; i >= 0; i--) {
- int num;// 相加以后位置要显示的数值
- j = Integer.parseInt(String.valueOf(num1.charAt(i)));
- k = Integer.parseInt(String.valueOf(num2.charAt(i)));
- if (j + k + jinwei >= 10 && i != 0) {
- num = j + k + jinwei - 10;
- jinwei = 1;
- } else {
- num = j + k + jinwei;
- jinwei = 0;
- }
- result = String.valueOf(num) + result;
- }
- // System.out.println(result);
- return result;
- }
- // 乘法运算,并且将num1作为乘数,num2为被乘数 即num2*num1
- String mult(String num1, String num2) {
- int length1 = num1.length();// 第一个字符串长度
- int length2 = num2.length();// 第二个字符串长度
- int temp1, temp2;// 临时保存两个位置上要乘积的值
- int jinwei = 0;// 保存进位默认为1
- String[] mult1 = new String[length1];// 保存每位乘积以后的结果,并且将num1作为乘数
- String count0 = "";// 保存计数后面需要加的0的个数
- for (int i = length1 - 1; i >= 0; i--) {// 将num1作为乘数
- int num;// 保存当前位应该显示数的数值
- mult1[length1 - i - 1] = "";// 为每个数组附初值
- for (int k = i; k < length1 - 1; k++)// 每移动一位,则在后面加一个0,即判断i到length1-1的距离
- {
- count0 += "0";
- }
- temp1 = Integer.parseInt(String.valueOf(num1.charAt(i)));// 乘数的第i位
- // 用乘数的第i位去乘被乘数的每一位
- for (int j = length2 - 1; j >= 0; j--) {
- temp2 = Integer.parseInt(String.valueOf(num2.charAt(j)));
- if (temp1 * temp2 + jinwei >= 10) {
- num = (temp1 * temp2 + jinwei) % 10;
- jinwei = (temp1 * temp2 + jinwei) / 10;
- // System.out.println("每位上要显示的数值:"+num);
- } else {
- num = temp1 * temp2 + jinwei;
- jinwei = 0;
- // System.out.println("每位上要显示的数值:"+num);
- }
- mult1[length1 - i - 1] = String.valueOf(num)
- + mult1[length1 - i - 1];
- // System.out.println(mult1[length1-i-1]);
- }
- // 每组乘积以后,如果 进位不为0,则将进位放在当前字符串的最前面,然后将进位清0
- if (jinwei != 0) {
- mult1[length1 - i - 1] = String.valueOf(jinwei)
- + mult1[length1 - i - 1];
- jinwei = 0;
- }
- mult1[length1 - i - 1] += count0;// 在每次乘积的后面补上0的个数
- count0 = "";// 每组数据加完0以后,将count0制空
- // System.out.println("所有要相加的值:" + mult1[length1 - i - 1]);
- }
- for (int i = 0; i < length1 - 1; i++)// 将每位乘积以后的数组,进行两两用add方法来求值,并将相加以后的结果保存在后面一个数组中
- {
- mult1[i + 1] = add(mult1[i], mult1[i + 1]);
- // System.out.println("每次两两相加结果:" + mult1[i + 1]);
- }
- return mult1[length1 - 1];// 依次求和以后,只要返回数组中的最后一个元数,便是乘积以后的值
- }
- // 两数相减,其中num1为被减数,num2为减数 即num1-num2
- String sub(String num1, String num2) {
- String str = "";// 结果中正负数标志
- int length1 = num1.length();
- int length2 = num2.length();
- String bignum = num1;// 假定第一个数为大数,第二个数为小数
- String smallnum = num2;
- if (length1 < length2)// 如果num1的长度 小于num2的长度,则结果为负数
- {
- str = "-";
- bignum = num2;
- smallnum = num1;
- }// end if(length1 < length2)
- if (length1 == length2)// 如果num1的长度和num2的长度相同,则比较每位数值
- {
- // 用compareTo来比较那个字符串比较大
- if (num1.compareTo(num2) > 0)// num1>num2
- {
- bignum = num1;
- smallnum = num2;
- } else if (num1.compareTo(num2) < 0)// num1<num2
- {
- bignum = num2;
- smallnum = num1;
- str = "-";
- }
- else
- // num1 == num2
- return "0";
- /*
- * 按位比较两个字符串的大小 int temp1 = 0, temp2 = 0;// 临时保存每位上的两个数值
- *
- * int i;// 计数 for (i = 0; i < length1; i++) { temp1 =
- * Integer.parseInt(String.valueOf(num1.charAt(i))); temp2 =
- * Integer.parseInt(String.valueOf(num2.charAt(i))); if (temp1 <
- * temp2)// 如果第i位上 第1个数值比第2个数值小,则结果为负数,跳出循环 { str = "-"; bignum =
- * num2; smallnum = num1; break; }// end if(temp1 < temp2) else //
- * 如果第i位上,第1个数值>=第2个数值,则继续下一位比较 continue; }// end for
- *
- * if (i == length1 && (temp1 == temp2))// 如果每位上的数值都相同,则结果为0,直接输出 {
- * return "0"; }
- */
- }// end if(length1 == length2)
- int jinwei = 0;// 保存进位
- int temp1, temp2;// 临时保存每位上要相减的两个数值
- smallnum = length(smallnum, bignum.length() - smallnum.length());
- String result = "";// 结果
- int length = bignum.length();// 统一长度以后的字符串长度
- for (int i = length - 1; i >= 0; i--) {
- int num = -1;// 相加以后位置要显示的数值
- temp1 = Integer.parseInt(String.valueOf(bignum.charAt(i)));
- temp2 = Integer.parseInt(String.valueOf(smallnum.charAt(i)));
- // System.out.println("temp1:"+ temp1 + "," + "temp2:" + temp2);
- if (jinwei == 0) {
- if (temp1 - temp2 < 0) {
- jinwei = 1;
- num = (temp1 - temp2 + 10) % 10;
- // System.out.println("每位上要显示的值0,<0:" + num);
- result = String.valueOf(num) + result;
- continue;
- }
- if (temp1 - temp2 == 0) {
- jinwei = 0;
- num = temp1 - temp2;
- // System.out.println("每位上要显示的值0,0:" + num);
- result = String.valueOf(num) + result;
- continue;
- }
- if (temp1 - temp2 > 0) {
- jinwei = 0;
- num = temp1 - temp2;
- // System.out.println("每位上要显示的值0,>0:" + num);
- result = String.valueOf(num) + result;
- continue;
- }
- }
- if (jinwei == 1) {
- if (temp1 - temp2 < 0) {
- num = (10 + (temp1 - temp2 - jinwei)) % 10;
- jinwei = 1;
- // System.out.println("每位上要显示的值1,<0:" + num);
- result = String.valueOf(num) + result;
- continue;
- }
- if (temp1 - temp2 == 0) {
- num = 10 - jinwei - (temp1 - temp2);
- jinwei = 1;
- // System.out.println("每位上要显示的值1,0:" + num);
- result = String.valueOf(num) + result;
- continue;
- }
- if (temp1 - temp2 > 0) {
- num = temp1 - temp2 - jinwei;
- jinwei = 0;
- // System.out.println("每位上要显示的值1,>0:" + num);
- result = String.valueOf(num) + result;
- continue;
- }
- }
- }
- // 删除结果中前面为0的数字
- while ('0' == (result.charAt(0))) {
- result = result.substring(1);
- // System.out.println("少了一个0:"+result);
- if ('0' != (result.charAt(0)))
- break;
- }
- result = str + result;// 加上正负数标志
- // System.out.println(str);
- return result;
- }
- // 除法,其中num1为被除数 num2为除数 即num1/num2
- // 每次都截取num1前面的length2长度的数值就和num2进行相除比较,并将所得的余数替换掉刚刚截取num1的字符串
- // 比如1234/13
- // 先取12<13,则num1向后移动一位为123/13,值为9,余数为6,则将num1变为64,再用64去除13,值为4,余数12,用12代替num1,即12/13,不够再补0,即120/13
- // 依次下去
- // 比较两个字符串的大小
- boolean num1mtnum2(String num1, String num2) {
- boolean num1mtnum2 = false;
- if (num1.length() < num2.length()) {
- num1mtnum2 = false;
- }
- if (num1.length() == num2.length()) {
- if (num1.compareTo(num2) >= 0) {
- num1mtnum2 = true;
- }
- if (num1.compareTo(num2) < 0) {
- num1mtnum2 = false;
- }
- }
- if (num1.length() > num2.length()) {
- num1mtnum2 = true;
- }
- return num1mtnum2;
- }
- // 删除字符串前面的0
- String slip0(String num) {
- while (num.length() > 1 && num.charAt(0) == '0') {
- num = num.substring(1);
- }
- return num;
- }
- String[] div(String num1, String num2)
- {
- String[] strResult = new String[2];
- int count = 0; // 小数点后的位数
- // int length1 = num1.length();//被除数的长度
- int length2 = num2.length();// 除数的长度
- String result = "0";// 保存两数相除以后的商
- String yushu = "0";// 保存余数,余数为0,表示刚好整除
- String cut_num1 = "";// 保存用来截取num1的部分值
- boolean num1mtnum2 = num1mtnum2(num1, num2);
- //如果当前的num1<num2那么就不进入while 循环
- while(num1mtnum2)// 如果当前num1的长度不为0,并且小数点后的位数不足10位,则继续循环,求值
- {
- int move = 1;// 用于保存一位一位的向后移动的参数
- if(num1.length() < length2)// 如果当前num1长度小于num2的长度,则表明num1不能再去整除num2了,余数即为num1
- {
- // System.out.println("num1.length()<length2 num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
- if(yushu.equals("0"))// 如果余数是0,表示上一轮是整除,而此时的num1又小于num2那么在result后面补上num1长度的0
- {
- // System.out.println("yushu.equals(0)");
- for(int i = 1; i <= num1.length();i++)
- {
- result = result + "0";
- }
- // System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
- }
- else// 否则补上 num1.length()- yushu.length()个数的0
- {
- // System.out.println("yushu.!!!!!!equals(0)");
- for(int i = 1; i <= num1.length() - yushu.length(); i ++)
- {
- result = result + "0";
- }
- // System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
- }
- num1mtnum2 = false;
- yushu = num1;
- slip0(yushu);
- continue;
- }// end if(num1.length() < length2)
- if(num1.length() == length2)// 当长度相等的时候,有3种情况:1num1>num2 num1=num2
- // num1<num2 长度相同的时候可以用compareTo来比较大小
- {
- // System.out.println("num1.length()==length2 num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
- if(num1.compareTo(num2) < 0 )// num1<num2
- {
- // System.out.println("num1.compareTo(num2) < 0");
- if(yushu.equals("0"))// 如果余数是0,表示上一轮是整除,而此时的num1又小于num2那么在result后面补上num1长度的0
- {
- // System.out.println("yushu==0");
- for(int i = 1; i <= num1.length();i++)
- {
- result = result + "0";
- }
- // System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
- }
- else// 否则补上 num1.length()- yushu.length()个数的0
- {
- // System.out.println("yushu!=0");
- for(int i = 1; i <= num1.length() - yushu.length(); i ++)
- {
- result = result + "0";
- }
- // System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
- }
- num1mtnum2 = false;
- yushu = num1;
- slip0(yushu);
- continue;
- }// end if(num1.compareTo(num2) < 0 )
- if(num1.compareTo(num2) >= 0)// num1>num2
- {
- // System.out.println("num1.compareTo(num2) >= 0 ");
- if(yushu.equals("0"))// 如果余数是0,表示上一轮是整除,而此时的num1大于num2那么在result后面补上num1长度-1个的0
- {
- // System.out.println("yushu==0");
- for(int i = 1; i < num1.length();i++)
- {
- result = result + "0";
- }
- // System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
- }
- else// 否则补上 num1.length()- yushu.length() - 1个的0
- {
- // System.out.println("yushu!=0");
- for(int i = 1; i < num1.length() - yushu.length(); i ++)
- {
- result = result + "0";
- }
- // System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
- }
- for(int i = 1 ; i <= 9; i++)
- {
- if(sub(num1,mult(num2,""+i)).charAt(0) == '0')
- {// 刚好整除 num1-num2*i = 0
- // System.out.println("num1-num2*i=0");
- yushu = "0";
- result = result + i;
- num1 = "";
- num1mtnum2 = false;
- // System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
- break;
- }
- if(sub(num1,mult(num2,""+i)).charAt(0) != '0' && sub(num1,mult(num2,""+i)).charAt(0) != '-' && sub(num1,mult(num2,""+i+1)).charAt(0) == '-')
- {// 如果num1-num2*i > 0 num1-num2*(i+1)<0
- // System.out.println("num1-num2*i>0 num1-num2*(i+1)<0");
- yushu = sub(cut_num1,mult(num2,""+i));
- result = result + i;
- num1 = yushu;
- num1mtnum2 = false;
- // System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
- break;
- }// end if(sub(num1,mult(num2,""+i)).charAt(0) != '-'
- // && sub(num1,mult(num2,""+i+1)).charAt(0) == '-')
- }// end for(int i = 1 ; i <= 9; i++)
- slip0(yushu);
- continue;
- }// if(num1.compareTo(num2) >= 0)
- }// end if(num1.length() == length2)
- if(num1.length() > length2)
- {// num1肯定大于num2
- // System.out.println("num1.length()>length2");
- // System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
- cut_num1 = num1.substring(0,length2);
- // System.out.println("cut_num1:"+cut_num1);
- // System.out.println("此时截取的值:"+ cut_num1);
- if(cut_num1.compareTo(num2) < 0)
- {// 截取的值小于num2
- // System.out.println("cut_num1.compareTo(num2)<0");
- // System.out.println("截取的值小于num2");
- if(yushu.equals("0"))// 如果余数是0,表示上一轮是整除,那么下次运算时,需在以前的商中补上截取长度-1个0
- {
- // System.out.println("yushu==0");
- for(int i = 1; i < cut_num1.length();i++)
- {
- result = result + "0";
- }
- // System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
- }
- else// 否则补上 num1.length()- yushu.length()个数的0
- {
- // System.out.println("yushu != 0");
- for(int i = 1; i < cut_num1.length() - yushu.length(); i ++)
- {
- result = result + "0";
- }
- // System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
- }
- cut_num1 = num1.substring(0,length2+1);// 多截取一位,由于num1。length() >length2所以不用考虑越界情况
- // System.out.println("再次截取的值:"+ cut_num1);
- if(!cut_num1.substring(0,cut_num1.length()-1).equals(yushu))//如果是直接在余数后面截取一位则不加0 否则商后面补一个0,至于商中没有值的情况,最后再作删除商前面值得操作
- result = result + "0";
- // System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
- for(int i = 1 ; i <= 9; i++)
- {
- // System.out.println(i);
- // System.out.println("sub(cut_num1,mult(num2,''+i)):" + sub(cut_num1,mult(num2,""+i)));
- // System.out.println("sub(cut_num1,mult(num2,''+i+1)):" + sub(cut_num1,mult(num2,""+(i+1))));
- if(sub(cut_num1,mult(num2,""+i)).charAt(0) != '-' && sub(cut_num1,mult(num2,""+(i+1))).charAt(0) == '-')
- {// 如果cut_num1-num2*i > 0
- // cut_num1-num2*(i+1)<0,此时不用考虑整除的情况
- // System.out.println("cut_num1 - num2*i >0 && cut_num1-num2*(i+1)<0");
- yushu = sub(cut_num1,mult(num2,""+i));
- result = result + i;
- num1 = yushu + num1.substring(cut_num1.length());// 此时的num1是余数+num1后面的数
- num1mtnum2 = num1mtnum2(num1, num2);// 比较下此时的num1和num2的大小
- // System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
- break;
- }// end if(sub(num1,mult(num2,""+i)).charAt(0) != '-'
- // && sub(num1,mult(num2,""+i+1)).charAt(0) == '-')
- }// end for(int i = 1 ; i <= 9; i++)
- slip0(yushu);
- continue;// 执行下次循环
- }
- if(cut_num1.compareTo(num2) >= 0)
- {// 截取的值>num2
- // System.out.println("cut_num1.compareTo(num2) >= 0");
- // System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
- if(yushu.equals("0"))// 如果余数是0,表示上一轮是整除,那么下次运算时,需在以前的商中补上截取长度-1个0
- {
- // System.out.println("yushu == 0");
- for(int i = 1; i < cut_num1.length();i++)
- {
- result = result + "0";
- }
- // System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
- }
- else// 否则补上 num1.length()- yushu.length()-1个的0
- {
- // System.out.println("yushu != 0");
- for(int i = 1; i < cut_num1.length() - yushu.length(); i ++)
- {
- result = result + "0";
- }
- // System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
- }
- // System.out.println("截取的值大于num2");
- for(int i = 1 ; i <= 9; i++)
- {
- // System.out.println("num2*i的结果:" + mult(num2,""+i));
- if(sub(cut_num1,mult(num2,""+i)).charAt(0) == '0')
- {// 刚好整除 num1-num2*i = 0
- // System.out.println("截取的值整除num2");
- yushu = "0";
- result = result + i;
- num1 = num1.substring(cut_num1.length());
- num1mtnum2 = num1mtnum2(num1,num2);
- // System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
- break;
- }
- if(sub(cut_num1,mult(num2,""+i)).charAt(0) != '0' && sub(cut_num1,mult(num2,""+i)).charAt(0) != '-' && sub(cut_num1,mult(num2,""+(i+1))).charAt(0) == '-')
- {// 如果cut_num1-num2*i > 0 cut_num1-num2*(i+1)<0
- // System.out.println("截取的值不能整除num2");
- yushu = sub(cut_num1,mult(num2,""+i));
- result = result + i;
- num1 = yushu + num1.substring(cut_num1.length());
- num1mtnum2 = num1mtnum2(num1,num2);
- // System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
- break;
- }// end if(sub(num1,add(num2,""+i)).charAt(0) != '-'
- // && sub(num1,add(num2,""+i+1)).charAt(0) == '-')
- }// end for(int i = 1 ; i <= 9; i++)
- slip0(yushu);
- continue;
- }
- }// end if(num1.length() > length2)
- }// end while
- //由于当num1<num2的时候就不执行while循环,所以最后还得处理余下来的几位数字
- // System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
- if(yushu.equals("0"))// 如果余数是0,表示上一轮是整除,而此时的num1又小于num2那么在result后面补上num1长度的0
- {
- // System.out.println("yushu.equals(0)");
- for(int i = 1; i <= num1.length();i++)
- {
- result = result + "0";
- }
- }
- else// 否则补上 num1.length()- yushu.length()个数的0
- {
- // System.out.println("yushu.!!!!!!equals(0)");
- for(int i = 1; i <= num1.length() - yushu.length(); i ++)
- {
- result = result + "0";
- }
- }
- //最后的余数就是当前的num1
- yushu = num1;
- // 去除商result最前面的0,除非result值中只有一个0
- while(result.length() > 1 && result.charAt(0) == '0')
- {
- result = result.substring(1);
- }
- // 将商和余数放在数组中返回
- strResult[0] = result;
- strResult[1] = yushu;
- // System.out.println("商:"+result);
- // System.out.println("余数:"+yushu);
- return strResult;
- }
- }
- 大数的加减乘除
- 大数的加减乘除
- c++ 大数的加减乘除
- 大数的加减乘除
- 大数的加减乘除
- 实现两个大数的加减乘除
- 大数的加减乘除取余
- 大数的加减乘除运算(C++)
- 大数取余的加减乘除
- 大数加减乘除
- 大数加减乘除
- 大数加减乘除
- 大数加减乘除
- 大数加减乘除
- 大数(加减乘除)
- 大数加减乘除?
- BigDecimal 类型的大数 的加减乘除运算
- 大数的运算(加减乘除)C代码
- Google Earth 发布北京奥运场馆卫星图
- C#将类文件编译为dll文件
- bizgreat jewelry
- 扩展DataGrid
- C#实现P2P应用程序(转)
- 大数的加减乘除
- Some basic socket functions
- ASP.NET 3.5 新特性开发向导实践(附项目源码下载)- Part 1
- [转]Javascript 实现复制到粘贴板
- IIS 5.1和IIS 6.0的区别
- CodeProject: EasySize - Dialog resizing in no time!. Free source code and programming help
- 委托、组件以及表面上的简单性
- NetBeans 6.5 Milestone 2 中DB Explorer将要提供的10个特性
- 能用的treeview数据无限绑定