大数的加减乘除

来源:互联网 发布:js style.border 编辑:程序博客网 时间:2024/06/02 15:09

大数的加减乘除

 

  1. package com.test;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. public class BigInt {
  6.     /**
  7.      * 
  8.      * 
  9.      * 
  10.      */
  11.     public static void main(String[] args) throws IOException {
  12.         // TODO Auto-generated method stub
  13.         BufferedReader stdin = new BufferedReader(new InputStreamReader(
  14.                 System.in));
  15.         String num1 = "";
  16.         String num2 = "";
  17.         boolean isill = true;// 判断输入的值是否合法
  18.         do {
  19.             System.out.println("输入第一串数字:");
  20.             num1 = stdin.readLine();
  21.             if (num1.length() == 0)// 如果没输入,则提示重新输入
  22.             {
  23.                 isill = false;
  24.                 System.out.println("输入的数字有误!");
  25.             }
  26.             if (num1.length() == 1)// 如果输入的是1个字符,则必须是0-9数字
  27.             {
  28.                 if (num1.matches("[0-9]") == false) {
  29.                     isill = false;
  30.                     System.out.println("输入的数字有误!");
  31.                 }
  32.             }
  33.             else {
  34.                 if (num1.matches("[-]*[1-9][0-9]*") == false)// 判断输入的字符串是否是非0开头的数字
  35.                 {
  36.                     isill = false;
  37.                     System.out.println("输入的数字有误!");
  38.                 }
  39.             }// end else
  40.         }// end do
  41.         while (isill == false);// 如果输入有误,则继续输入
  42.         do {
  43.             System.out.println("输入第二串数字:");
  44.             num2 = stdin.readLine();
  45.             // System.out.println("num2的长度"+num2.length());
  46.             if (num2.length() == 0)// 如果没输入,则提示重新输入
  47.             {
  48.                 isill = false;
  49.                 System.out.println("输入的数字有误!");
  50.                 // continue;
  51.             }
  52.             if (num2.length() == 1)// 如果输入的是1个字符,则必须是0-9数字
  53.             {
  54.                 if (num2.matches("[1-9]") == false) {
  55.                     isill = false;
  56.                     System.out.println("输入的数字有误!");
  57.                     // continue;
  58.                 }
  59.             }
  60.             else {
  61.                 if (num2.matches("[-]*[1-9][0-9]*") == false)// 判断输入的字符串是否是非0开头的数字
  62.                 {
  63.                     isill = false;
  64.                     System.out.println("输入的数字有误!");
  65.                     // continue;
  66.                 }
  67.             }
  68.         } while (isill == false);// 如果输入有误,则继续输入
  69.         BigInt bi = new BigInt();
  70.         if (num1.charAt(0) == '-' && num2.charAt(0) != '-')// 如果前者是负数,后者是正数
  71.         {
  72.             System.out.println("两数之和:(" + num1 + ")+(" + num2 + ")="
  73.                     + bi.sub(num2, num1.substring(1, num1.length())));// 输出两数相加结果
  74.             System.out.println("两数之差:(" + num1 + ")-(" + num2 + ")=" + "-"
  75.                     + bi.add(num1.substring(1, num1.length()), num2));// 输出两数相减结果
  76.             System.out.println("两数之积:(" + num1 + ")*(" + num2 + ")=" + "-"
  77.                     + bi.mult(num1.substring(1, num1.length()), num2));// 输出两数相乘结果
  78.             String[] div = bi.div(num1.substring(1, num1.length()), num2);
  79.             System.out.println("两数相除:(" + num1 + ")/(" + num2 + ")  商=" + "-"
  80.                     + div[0] + ",余数=" + div[1]);// 输出两数相除结果
  81.         }
  82.         if (num1.charAt(0) != '-' && num2.charAt(0) == '-')// 如果前者是正数,后者是负数
  83.         {
  84.             System.out.println("两数之和:(" + num1 + ")+(" + num2 + ")="
  85.                     + bi.sub(num1, num2.substring(1, num2.length())));// 输出两数相加结果
  86.             System.out.println("两数之差:(" + num1 + ")-(" + num2 + ")="
  87.                     + bi.add(num1, num2.substring(1, num2.length())));// 输出两数相减结果
  88.             System.out.println("两数之积:(" + num1 + ")*(" + num2 + ")=" + "-"
  89.                     + bi.mult(num1, num2.substring(1, num2.length())));// 输出两数相乘结果
  90.             String[] div = bi.div(num1, num2.substring(1, num2.length()));
  91.             System.out.println("两数相除:(" + num1 + ")/(" + num2 + ") 商=" + "-"
  92.                     + div[0] + ",余数=" + div[1]);// 输出两数相除结果
  93.         }
  94.         if (num1.charAt(0) == '-' && num2.charAt(0) == '-')// 如果前者是负数,后者是负数
  95.         {
  96.             System.out.println("两数之和:("
  97.                     + num1
  98.                     + ")+("
  99.                     + num2
  100.                     + ")="
  101.                     + "-"
  102.                     + bi.add(num1.substring(1, num1.length()), num2.substring(
  103.                             1, num2.length())));// 输出两数相加结果
  104.             System.out.println("两数之差:("
  105.                     + num1
  106.                     + ")-("
  107.                     + num2
  108.                     + ")="
  109.                     + bi.sub(num2.substring(1, num2.length()), num1.substring(
  110.                             1, num1.length())));// 输出两数相减结果
  111.             System.out.println("两数之积:("
  112.                     + num1
  113.                     + ")*("
  114.                     + num2
  115.                     + ")="
  116.                     + bi.mult(num1.substring(1, num1.length()), num2.substring(
  117.                             1, num2.length())));// 输出两数相乘结果
  118.             String[] div = bi.div(num1.substring(1, num1.length()), num2
  119.                     .substring(1, num2.length()));
  120.             System.out.println("两数相除:(" + num1 + ")/(" + num2 + ") 商=" + div[0]
  121.                     + ",余数=" + div[1]);// 输出两数相除结果
  122.         }
  123.         if (num1.charAt(0) != '-' && num2.charAt(0) != '-')// 全正数
  124.         {
  125.             System.out.println("两数之和:(" + num1 + ")+(" + num2 + ")="
  126.                     + bi.add(num1, num2));// 输出两数相加结果
  127.             System.out.println("两数之积:(" + num1 + ")*(" + num2 + ")="
  128.                     + bi.mult(num1, num2));// 输出两数相乘结果
  129.             System.out.println("两数之差:(" + num1 + ")-(" + num2 + ")="
  130.                     + bi.sub(num1, num2));// 输出两数相减结果
  131.             String[] div = bi.div(num1, num2);
  132.             System.out.println("两数相除:(" + num1 + ")/(" + num2 + ") 商=" + div[0]
  133.                     + ",余数=" + div[1]);// 输出两数相除结果
  134.         }
  135.         // System.out.println(num1+" " +num2);
  136.         // System.out.println(bi.split(num1).toString()+bi.split(num2).toString());
  137.     }
  138.     // 统一长度,将返回补了0以后的数组
  139.     String length(String num, int length)// num个数小的字符串,length相差的个数
  140.     {
  141.         String count0 = "";// 需要补0的个数
  142.         for (int i = 0; i < length; i++) {
  143.             count0 += "0";
  144.         }
  145.         return count0 + num;
  146.     }
  147.     
  148.     
  149.     
  150.     
  151.     
  152.     // 加运算 num1+num2
  153.     String add(String num1, String num2) {
  154.         // num1 = num1.substring(1);
  155.         if (num1.length() >= num2.length())// 如果第一个字符串比较短,则将它补0
  156.         {
  157.             num2 = length(num2, num1.length() - num2.length());
  158.         }
  159.         else
  160.             num1 = length(num1, num2.length() - num1.length());
  161.         int length = num1.length();// 长度统一以后,取第一个数的长度
  162.         int j, k = 0;// 临时保存两个位上要计数的值
  163.         String result = "";// 结果
  164.         int jinwei = 0;// 保存进位,0表示没进位,1表示进位为1
  165.         for (int i = length - 1; i >= 0; i--) {
  166.             int num;// 相加以后位置要显示的数值
  167.             j = Integer.parseInt(String.valueOf(num1.charAt(i)));
  168.             k = Integer.parseInt(String.valueOf(num2.charAt(i)));
  169.             if (j + k + jinwei >= 10 && i != 0) {
  170.                 num = j + k + jinwei - 10;
  171.                 jinwei = 1;
  172.             } else {
  173.                 num = j + k + jinwei;
  174.                 jinwei = 0;
  175.             }
  176.             result = String.valueOf(num) + result;
  177.         }
  178.         // System.out.println(result);
  179.         return result;
  180.     }
  181.     
  182.     
  183.     
  184.     
  185.     
  186.     // 乘法运算,并且将num1作为乘数,num2为被乘数 即num2*num1
  187.     String mult(String num1, String num2) {
  188.         int length1 = num1.length();// 第一个字符串长度
  189.         int length2 = num2.length();// 第二个字符串长度
  190.         int temp1, temp2;// 临时保存两个位置上要乘积的值
  191.         int jinwei = 0;// 保存进位默认为1
  192.         String[] mult1 = new String[length1];// 保存每位乘积以后的结果,并且将num1作为乘数
  193.         String count0 = "";// 保存计数后面需要加的0的个数
  194.         for (int i = length1 - 1; i >= 0; i--) {// 将num1作为乘数
  195.             int num;// 保存当前位应该显示数的数值
  196.             mult1[length1 - i - 1] = "";// 为每个数组附初值
  197.             for (int k = i; k < length1 - 1; k++)// 每移动一位,则在后面加一个0,即判断i到length1-1的距离
  198.             {
  199.                 count0 += "0";
  200.             }
  201.             temp1 = Integer.parseInt(String.valueOf(num1.charAt(i)));// 乘数的第i位
  202.             // 用乘数的第i位去乘被乘数的每一位
  203.             for (int j = length2 - 1; j >= 0; j--) {
  204.                 temp2 = Integer.parseInt(String.valueOf(num2.charAt(j)));
  205.                 if (temp1 * temp2 + jinwei >= 10) {
  206.                     num = (temp1 * temp2 + jinwei) % 10;
  207.                     jinwei = (temp1 * temp2 + jinwei) / 10;
  208.                     // System.out.println("每位上要显示的数值:"+num);
  209.                 } else {
  210.                     num = temp1 * temp2 + jinwei;
  211.                     jinwei = 0;
  212.                     // System.out.println("每位上要显示的数值:"+num);
  213.                 }
  214.                 mult1[length1 - i - 1] = String.valueOf(num)
  215.                         + mult1[length1 - i - 1];
  216.                 // System.out.println(mult1[length1-i-1]);
  217.             }
  218.             // 每组乘积以后,如果 进位不为0,则将进位放在当前字符串的最前面,然后将进位清0
  219.             if (jinwei != 0) {
  220.                 mult1[length1 - i - 1] = String.valueOf(jinwei)
  221.                         + mult1[length1 - i - 1];
  222.                 jinwei = 0;
  223.             }
  224.             mult1[length1 - i - 1] += count0;// 在每次乘积的后面补上0的个数
  225.             count0 = "";// 每组数据加完0以后,将count0制空
  226.             // System.out.println("所有要相加的值:" + mult1[length1 - i - 1]);
  227.         }
  228.         for (int i = 0; i < length1 - 1; i++)// 将每位乘积以后的数组,进行两两用add方法来求值,并将相加以后的结果保存在后面一个数组中
  229.         {
  230.             mult1[i + 1] = add(mult1[i], mult1[i + 1]);
  231.             // System.out.println("每次两两相加结果:" + mult1[i + 1]);
  232.         }
  233.         return mult1[length1 - 1];// 依次求和以后,只要返回数组中的最后一个元数,便是乘积以后的值
  234.     }
  235.     // 两数相减,其中num1为被减数,num2为减数 即num1-num2
  236.     String sub(String num1, String num2) {
  237.         String str = "";// 结果中正负数标志
  238.         int length1 = num1.length();
  239.         int length2 = num2.length();
  240.         String bignum = num1;// 假定第一个数为大数,第二个数为小数
  241.         String smallnum = num2;
  242.         if (length1 < length2)// 如果num1的长度 小于num2的长度,则结果为负数
  243.         {
  244.             str = "-";
  245.             bignum = num2;
  246.             smallnum = num1;
  247.         }// end if(length1 < length2)
  248.         if (length1 == length2)// 如果num1的长度和num2的长度相同,则比较每位数值
  249.         {
  250.             // 用compareTo来比较那个字符串比较大
  251.             if (num1.compareTo(num2) > 0)// num1>num2
  252.             {
  253.                 bignum = num1;
  254.                 smallnum = num2;
  255.             } else if (num1.compareTo(num2) < 0)// num1<num2
  256.             {
  257.                 bignum = num2;
  258.                 smallnum = num1;
  259.                 str = "-";
  260.             }
  261.             else
  262.                 // num1 == num2
  263.                 return "0";
  264.             /*
  265.              * 按位比较两个字符串的大小 int temp1 = 0, temp2 = 0;// 临时保存每位上的两个数值
  266.              * 
  267.              * int i;// 计数 for (i = 0; i < length1; i++) { temp1 =
  268.              * Integer.parseInt(String.valueOf(num1.charAt(i))); temp2 =
  269.              * Integer.parseInt(String.valueOf(num2.charAt(i))); if (temp1 <
  270.              * temp2)// 如果第i位上 第1个数值比第2个数值小,则结果为负数,跳出循环 { str = "-"; bignum =
  271.              * num2; smallnum = num1; break; }// end if(temp1 < temp2) else //
  272.              * 如果第i位上,第1个数值>=第2个数值,则继续下一位比较 continue; }// end for
  273.              * 
  274.              * if (i == length1 && (temp1 == temp2))// 如果每位上的数值都相同,则结果为0,直接输出 {
  275.              * return "0"; }
  276.              */
  277.         }// end if(length1 == length2)
  278.         int jinwei = 0;// 保存进位
  279.         int temp1, temp2;// 临时保存每位上要相减的两个数值
  280.         smallnum = length(smallnum, bignum.length() - smallnum.length());
  281.         String result = "";// 结果
  282.         int length = bignum.length();// 统一长度以后的字符串长度
  283.         for (int i = length - 1; i >= 0; i--) {
  284.             int num = -1;// 相加以后位置要显示的数值
  285.             temp1 = Integer.parseInt(String.valueOf(bignum.charAt(i)));
  286.             temp2 = Integer.parseInt(String.valueOf(smallnum.charAt(i)));
  287.             // System.out.println("temp1:"+ temp1 + "," + "temp2:" + temp2);
  288.             if (jinwei == 0) {
  289.                 if (temp1 - temp2 < 0) {
  290.                     jinwei = 1;
  291.                     num = (temp1 - temp2 + 10) % 10;
  292.                     // System.out.println("每位上要显示的值0,<0:" + num);
  293.                     result = String.valueOf(num) + result;
  294.                     continue;
  295.                 }
  296.                 if (temp1 - temp2 == 0) {
  297.                     jinwei = 0;
  298.                     num = temp1 - temp2;
  299.                     // System.out.println("每位上要显示的值0,0:" + num);
  300.                     result = String.valueOf(num) + result;
  301.                     continue;
  302.                 }
  303.                 if (temp1 - temp2 > 0) {
  304.                     jinwei = 0;
  305.                     num = temp1 - temp2;
  306.                     // System.out.println("每位上要显示的值0,>0:" + num);
  307.                     result = String.valueOf(num) + result;
  308.                     continue;
  309.                 }
  310.             }
  311.             if (jinwei == 1) {
  312.                 if (temp1 - temp2 < 0) {
  313.                     num = (10 + (temp1 - temp2 - jinwei)) % 10;
  314.                     jinwei = 1;
  315.                     // System.out.println("每位上要显示的值1,<0:" + num);
  316.                     result = String.valueOf(num) + result;
  317.                     continue;
  318.                 }
  319.                 if (temp1 - temp2 == 0) {
  320.                     num = 10 - jinwei - (temp1 - temp2);
  321.                     jinwei = 1;
  322.                     // System.out.println("每位上要显示的值1,0:" + num);
  323.                     result = String.valueOf(num) + result;
  324.                     continue;
  325.                 }
  326.                 if (temp1 - temp2 > 0) {
  327.                     num = temp1 - temp2 - jinwei;
  328.                     jinwei = 0;
  329.                     // System.out.println("每位上要显示的值1,>0:" + num);
  330.                     result = String.valueOf(num) + result;
  331.                     continue;
  332.                 }
  333.             }
  334.         }
  335.         // 删除结果中前面为0的数字
  336.         while ('0' == (result.charAt(0))) {
  337.             result = result.substring(1);
  338.             // System.out.println("少了一个0:"+result);
  339.             if ('0' != (result.charAt(0)))
  340.                 break;
  341.         }
  342.         result = str + result;// 加上正负数标志
  343.         // System.out.println(str);
  344.         return result;
  345.     }
  346.     // 除法,其中num1为被除数 num2为除数 即num1/num2
  347.     // 每次都截取num1前面的length2长度的数值就和num2进行相除比较,并将所得的余数替换掉刚刚截取num1的字符串
  348.     // 比如1234/13
  349.     // 先取12<13,则num1向后移动一位为123/13,值为9,余数为6,则将num1变为64,再用64去除13,值为4,余数12,用12代替num1,即12/13,不够再补0,即120/13
  350.     // 依次下去
  351.     // 比较两个字符串的大小
  352.     boolean num1mtnum2(String num1, String num2) {
  353.         boolean num1mtnum2 = false;
  354.         if (num1.length() < num2.length()) {
  355.             num1mtnum2 = false;
  356.         }
  357.         if (num1.length() == num2.length()) {
  358.             if (num1.compareTo(num2) >= 0) {
  359.                 num1mtnum2 = true;
  360.             }
  361.             if (num1.compareTo(num2) < 0) {
  362.                 num1mtnum2 = false;
  363.             }
  364.         }
  365.         if (num1.length() > num2.length()) {
  366.             num1mtnum2 = true;
  367.         }
  368.         return num1mtnum2;
  369.     }
  370.     // 删除字符串前面的0
  371.     String slip0(String num) {
  372.         while (num.length() > 1 && num.charAt(0) == '0') {
  373.             num = num.substring(1);
  374.         }
  375.         return num;
  376.     }
  377.     String[] div(String num1, String num2)
  378.     {
  379.         
  380.         
  381.         String[] strResult = new String[2];
  382.         
  383.         int count = 0// 小数点后的位数
  384.         
  385.         // int length1 = num1.length();//被除数的长度
  386.         int length2 = num2.length();// 除数的长度
  387.         
  388.         
  389.         String result = "0";// 保存两数相除以后的商
  390.         String yushu = "0";// 保存余数,余数为0,表示刚好整除
  391.         
  392.         String cut_num1 = "";// 保存用来截取num1的部分值
  393.         
  394.         boolean num1mtnum2 = num1mtnum2(num1, num2);
  395.         
  396.         //如果当前的num1<num2那么就不进入while 循环
  397.         while(num1mtnum2)// 如果当前num1的长度不为0,并且小数点后的位数不足10位,则继续循环,求值
  398.         {
  399.             int move = 1;// 用于保存一位一位的向后移动的参数
  400.             
  401.             
  402.             if(num1.length() < length2)// 如果当前num1长度小于num2的长度,则表明num1不能再去整除num2了,余数即为num1
  403.             {
  404.                 
  405. //              System.out.println("num1.length()<length2 num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
  406.                 
  407.                 
  408.                 
  409.                 if(yushu.equals("0"))// 如果余数是0,表示上一轮是整除,而此时的num1又小于num2那么在result后面补上num1长度的0
  410.                 {
  411.                     
  412. //                  System.out.println("yushu.equals(0)");
  413.                     
  414.                     for(int i = 1; i <= num1.length();i++)
  415.                     {
  416.                         result = result + "0";
  417.                     }
  418.                     
  419. //                  System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
  420.                 }
  421.                 
  422.                 else// 否则补上 num1.length()- yushu.length()个数的0
  423.                 {
  424.                     
  425.                     
  426. //                  System.out.println("yushu.!!!!!!equals(0)");
  427.                     
  428.                     for(int i = 1; i <= num1.length() - yushu.length(); i ++)
  429.                     {
  430.                         result = result + "0";
  431.                     }
  432.                     
  433. //                  System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
  434.                 }
  435.                 
  436.                 
  437.                 num1mtnum2 = false;
  438.                 yushu = num1;
  439.                 
  440.                 
  441.                 slip0(yushu);
  442.                 continue;
  443.             }// end if(num1.length() < length2)
  444.             
  445.             if(num1.length() == length2)// 当长度相等的时候,有3种情况:1num1>num2 num1=num2
  446.                                         // num1<num2 长度相同的时候可以用compareTo来比较大小
  447.             {
  448.                 
  449. //              System.out.println("num1.length()==length2 num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
  450.                 
  451.                 if(num1.compareTo(num2) < 0 )// num1<num2
  452.                 {
  453.                     
  454. //                  System.out.println("num1.compareTo(num2) < 0");
  455.                     
  456.                     
  457.                     if(yushu.equals("0"))// 如果余数是0,表示上一轮是整除,而此时的num1又小于num2那么在result后面补上num1长度的0
  458.                     {
  459.                         
  460. //                      System.out.println("yushu==0");
  461.                         
  462.                         for(int i = 1; i <= num1.length();i++)
  463.                         {
  464.                             result = result + "0";
  465.                         }
  466.                         
  467. //                      System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
  468.                     }
  469.                     
  470.                     else// 否则补上 num1.length()- yushu.length()个数的0
  471.                     {
  472.                         
  473. //                      System.out.println("yushu!=0");
  474.                         for(int i = 1; i <= num1.length() - yushu.length(); i ++)
  475.                         {
  476.                             result = result + "0";
  477.                         }
  478.                         
  479. //                      System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
  480.                     }
  481.                     
  482.                     num1mtnum2 = false;
  483.                     yushu = num1;
  484.                     
  485.                     slip0(yushu);
  486.                     continue;
  487.                 }// end if(num1.compareTo(num2) < 0 )
  488.                 
  489.                 
  490.                 if(num1.compareTo(num2) >= 0)// num1>num2
  491.                 {
  492. //                  System.out.println("num1.compareTo(num2) >= 0 ");
  493.                     
  494.                     if(yushu.equals("0"))// 如果余数是0,表示上一轮是整除,而此时的num1大于num2那么在result后面补上num1长度-1个的0
  495.                     {
  496. //                      System.out.println("yushu==0");
  497.                         for(int i = 1; i < num1.length();i++)
  498.                         {
  499.                             result = result + "0";
  500.                         }
  501.                         
  502. //                      System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
  503.                     }
  504.                     
  505.                     else// 否则补上 num1.length()- yushu.length() - 1个的0
  506.                     {
  507. //                      System.out.println("yushu!=0");
  508.                         for(int i = 1; i < num1.length() - yushu.length(); i ++)
  509.                         {
  510.                             result = result + "0";
  511.                         }
  512. //                      System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
  513.                     }
  514.                     
  515.                     
  516.                     
  517.                     for(int i = 1 ; i <= 9; i++)
  518.                     {
  519.                         if(sub(num1,mult(num2,""+i)).charAt(0) == '0')
  520.                         {// 刚好整除 num1-num2*i = 0
  521.                             
  522. //                          System.out.println("num1-num2*i=0");
  523.                             
  524.                             yushu = "0";
  525.                             result = result + i;
  526.                             num1 = "";
  527.                             num1mtnum2 = false;
  528.                             
  529. //                          System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
  530.                             
  531.                             break;
  532.                         }
  533.                         
  534.                         
  535.                         
  536.                         
  537.                         if(sub(num1,mult(num2,""+i)).charAt(0) != '0' && sub(num1,mult(num2,""+i)).charAt(0) != '-' && sub(num1,mult(num2,""+i+1)).charAt(0) == '-')
  538.                         {// 如果num1-num2*i > 0 num1-num2*(i+1)<0
  539.                             
  540. //                          System.out.println("num1-num2*i>0 num1-num2*(i+1)<0");
  541.                             
  542.                             yushu = sub(cut_num1,mult(num2,""+i));
  543.                             result = result + i;
  544.                             num1 = yushu;
  545.                             num1mtnum2 = false;
  546. //                          System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
  547.                             break;
  548.                         }// end if(sub(num1,mult(num2,""+i)).charAt(0) != '-'
  549.                             // && sub(num1,mult(num2,""+i+1)).charAt(0) == '-')
  550.                         
  551.                     }// end for(int i = 1 ; i <= 9; i++)
  552.                     
  553.                     
  554.                     slip0(yushu);
  555.                     continue;
  556.                 }// if(num1.compareTo(num2) >= 0)
  557.                 
  558.             }// end if(num1.length() == length2)
  559.             
  560.             
  561.             if(num1.length() > length2)
  562.             {// num1肯定大于num2
  563.                 
  564.             
  565. //              System.out.println("num1.length()>length2");
  566. //              System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
  567.                 
  568.                 
  569.                 cut_num1 = num1.substring(0,length2);
  570.                 
  571. //              System.out.println("cut_num1:"+cut_num1);
  572.                 
  573.                 // System.out.println("此时截取的值:"+ cut_num1);
  574.                 
  575.                 if(cut_num1.compareTo(num2) < 0)
  576.                 {// 截取的值小于num2
  577.                     
  578. //                  System.out.println("cut_num1.compareTo(num2)<0");
  579.                     
  580.                     // System.out.println("截取的值小于num2");
  581.                     
  582.                     
  583.                     if(yushu.equals("0"))// 如果余数是0,表示上一轮是整除,那么下次运算时,需在以前的商中补上截取长度-1个0
  584.                     {
  585.                         
  586. //                      System.out.println("yushu==0");
  587.                         
  588.                         for(int i = 1; i < cut_num1.length();i++)
  589.                         {
  590.                             result = result + "0";
  591.                         }
  592. //                      System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
  593.                     }
  594.                     
  595.                     else// 否则补上 num1.length()- yushu.length()个数的0
  596.                     {
  597.                         
  598. //                      System.out.println("yushu != 0");
  599.                         for(int i = 1; i < cut_num1.length() - yushu.length(); i ++)
  600.                         {
  601.                             result = result + "0";
  602.                         }
  603.                         
  604. //                      System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
  605.                     }
  606.                     
  607.                     
  608.                     
  609.                     cut_num1 = num1.substring(0,length2+1);// 多截取一位,由于num1。length() >length2所以不用考虑越界情况
  610.                     
  611.                     
  612. //                  System.out.println("再次截取的值:"+ cut_num1);
  613.                     
  614.                     if(!cut_num1.substring(0,cut_num1.length()-1).equals(yushu))//如果是直接在余数后面截取一位则不加0  否则商后面补一个0,至于商中没有值的情况,最后再作删除商前面值得操作
  615.                         result = result + "0";
  616.                     
  617. //                  System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
  618.                     
  619.                     
  620.                     for(int i = 1 ; i <= 9; i++)
  621.                     {   
  622.                         
  623. //                      System.out.println(i);
  624.                         
  625. //                      System.out.println("sub(cut_num1,mult(num2,''+i)):" + sub(cut_num1,mult(num2,""+i)));
  626. //                      System.out.println("sub(cut_num1,mult(num2,''+i+1)):" + sub(cut_num1,mult(num2,""+(i+1))));
  627.                         if(sub(cut_num1,mult(num2,""+i)).charAt(0) != '-' && sub(cut_num1,mult(num2,""+(i+1))).charAt(0) == '-')
  628.                         {// 如果cut_num1-num2*i > 0
  629.                             // cut_num1-num2*(i+1)<0,此时不用考虑整除的情况
  630.                             
  631. //                          System.out.println("cut_num1 - num2*i >0 && cut_num1-num2*(i+1)<0");
  632.                             yushu = sub(cut_num1,mult(num2,""+i));
  633.                             result = result + i;
  634.                             num1 = yushu + num1.substring(cut_num1.length());// 此时的num1是余数+num1后面的数
  635.                             num1mtnum2 = num1mtnum2(num1, num2);// 比较下此时的num1和num2的大小
  636.                             
  637.                             
  638. //                          System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
  639.                             
  640.                             break;
  641.                         }// end if(sub(num1,mult(num2,""+i)).charAt(0) != '-'
  642.                             // && sub(num1,mult(num2,""+i+1)).charAt(0) == '-')
  643.                         
  644.                     }// end for(int i = 1 ; i <= 9; i++)
  645.                 
  646.                     
  647.                     slip0(yushu);
  648.                     continue;// 执行下次循环
  649.                 }
  650.                 
  651.                 if(cut_num1.compareTo(num2) >= 0)
  652.                 {// 截取的值>num2
  653.                     
  654.                     
  655.                     
  656. //                  System.out.println("cut_num1.compareTo(num2) >= 0");
  657.                     
  658. //                  System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
  659.                     
  660.                     if(yushu.equals("0"))// 如果余数是0,表示上一轮是整除,那么下次运算时,需在以前的商中补上截取长度-1个0
  661.                     {
  662. //                      System.out.println("yushu == 0");
  663.                         
  664.                         for(int i = 1; i < cut_num1.length();i++)
  665.                         {
  666.                             result = result + "0";
  667.                         }
  668.                         
  669. //                      System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
  670.                     }
  671.                     
  672.                     else// 否则补上 num1.length()- yushu.length()-1个的0
  673.                     {
  674.                         
  675. //                      System.out.println("yushu != 0");
  676.                         
  677.                         for(int i = 1; i < cut_num1.length() - yushu.length(); i ++)
  678.                         {
  679.                             result = result + "0";
  680.                         }
  681. //                      System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
  682.                     }
  683.                     
  684.                     
  685.                     // System.out.println("截取的值大于num2");
  686.                     
  687.                     for(int i = 1 ; i <= 9; i++)
  688.                     {
  689.                         
  690.                         // System.out.println("num2*i的结果:" + mult(num2,""+i));
  691.                         
  692.                         if(sub(cut_num1,mult(num2,""+i)).charAt(0) == '0')
  693.                         {// 刚好整除 num1-num2*i = 0
  694.                             
  695. //                          System.out.println("截取的值整除num2");
  696.                             
  697.                             yushu = "0";
  698.                             result = result + i;
  699.                             num1 =  num1.substring(cut_num1.length());
  700.                             num1mtnum2 = num1mtnum2(num1,num2);
  701.                             
  702. //                          System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
  703.                             
  704.                             break;
  705.                         }
  706.                         
  707.                         
  708.                         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) == '-')
  709.                         {// 如果cut_num1-num2*i > 0 cut_num1-num2*(i+1)<0
  710.                             
  711. //                          System.out.println("截取的值不能整除num2");
  712.                             
  713.                             yushu = sub(cut_num1,mult(num2,""+i));
  714.                             result = result + i;
  715.                             num1 = yushu + num1.substring(cut_num1.length());
  716.                             num1mtnum2 = num1mtnum2(num1,num2);
  717.                             
  718. //                          System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
  719.                             
  720.                             break;
  721.                         }// end if(sub(num1,add(num2,""+i)).charAt(0) != '-'
  722.                             // && sub(num1,add(num2,""+i+1)).charAt(0) == '-')
  723.                         
  724.                     }// end for(int i = 1 ; i <= 9; i++)
  725.                     
  726.                     
  727.                     slip0(yushu);
  728.                     continue;
  729.                 }
  730.                 
  731.             }// end if(num1.length() > length2)
  732.             
  733.             
  734.             
  735.             
  736.             
  737.         
  738.         }// end while
  739.         
  740.         
  741.         
  742.         
  743.         //由于当num1<num2的时候就不执行while循环,所以最后还得处理余下来的几位数字
  744. //          System.out.println("num1:" + num1 + ",result:"+result+ ",yushu:" + yushu);
  745.             
  746.             
  747.             
  748.             if(yushu.equals("0"))// 如果余数是0,表示上一轮是整除,而此时的num1又小于num2那么在result后面补上num1长度的0
  749.             {
  750.                 
  751. //              System.out.println("yushu.equals(0)");
  752.                 
  753.                 for(int i = 1; i <= num1.length();i++)
  754.                 {
  755.                     result = result + "0";
  756.                 }
  757.             }
  758.             
  759.             else// 否则补上 num1.length()- yushu.length()个数的0
  760.             {
  761.                 
  762.                 
  763. //              System.out.println("yushu.!!!!!!equals(0)");
  764.                 
  765.                 for(int i = 1; i <= num1.length() - yushu.length(); i ++)
  766.                 {
  767.                     result = result + "0";
  768.                 }
  769.             }
  770.             
  771.             //最后的余数就是当前的num1
  772.             yushu = num1;
  773.         
  774.         
  775.             
  776.         
  777.         
  778.         // 去除商result最前面的0,除非result值中只有一个0
  779.         while(result.length() > 1 && result.charAt(0) == '0')
  780.         {
  781.             result = result.substring(1);
  782.         }
  783.         
  784.         
  785.         // 将商和余数放在数组中返回
  786.         strResult[0] = result;
  787.         strResult[1] = yushu;
  788.         
  789.         // System.out.println("商:"+result);
  790.         // System.out.println("余数:"+yushu);
  791.         
  792.         
  793.         return strResult;
  794.     }
  795. }
原创粉丝点击