다음은 초등학교에서 배우는 나눗셈 계산표를 만들어주는 Java 소스 코드이다.
나눗셈 계산표를 완성하고 나서 약수, 배수 관계를 알려준다.


  1. /*
  2.  *  Filename: MakeDivisionTableApp.java
  3.  *
  4.  *  Purpose:  Make a division table in a handy written form.
  5.  *
  6.  *  Compile: javac -d . MakeDivisionTableApp.java
  7.  *
  8.  *  Execute: java MakeDivisionTableApp 12345 32
  9.  *           java MakeDivisionTableApp 500210 61
  10.  *
  11.  *     Date:  2008/05/15
  12.  *   Author:  PH Kim   [ pkim ((AT)) scripts.pe.kr ]
  13.  */
  14. import java.math.*;
  15. public class MakeDivisionTableApp {
  16.     public static void printUsage() {
  17.          // System.out.println("Using: java MakeDivisionTableApp [numerator] [denominator]");
  18.          // System.out.println("Make a division table in a handy written form.");
  19.          System.out.println("사용법: java MakeDivisionTableApp [피제수] [제수]");
  20.          System.out.println("손으로 작성한 형태의 나눗셈 표를 만들어준다.");
  21.     }
  22.     public static String simplify(double v) {
  23.         String t = "" + v;
  24.         if (t.endsWith(".0"))
  25.             t = t.substring(0, t.length() - 2);
  26.         return t;
  27.     }
  28.     public static String simplify(BigInteger v, int width) {
  29.         String t = "" + v;
  30.         if (t.endsWith(".0"))
  31.             t = t.substring(0, t.length() - 2);
  32.         int len = t.length();
  33.         if (len < width)
  34.             t = "                                                                                             ".substring(0, width - len) + t;
  35.         return t;
  36.     }
  37.     public String getSuffix(BigInteger v) {
  38.         BigInteger t = v.mod(new BigInteger("10"));
  39.         String suffix = "은";
  40.         if ("2459".indexOf("" + t) >= 0) {
  41.             suffix = "는";
  42.         }
  43.         return suffix;
  44.     }
  45.     public BigInteger makeTable(BigInteger numer, BigInteger denom, BigInteger quotient) {
  46.         String strNumer = "" + numer;
  47.         String strDenom = "" + denom;
  48.         String strQuotient = "" + quotient;
  49.         int lenN = strNumer .length();
  50.         int lenD = strDenom .length();
  51.         int lenQ = strQuotient .length();
  52.         int offsetLeft = 3 + lenD + 3;
  53.         String spaces = "                                                                                 ";
  54.         String uline  = "_________________________________________________________________________________".substring(0, lenN + 2);
  55.         String sline  = "---------------------------------------------------------------------------------".substring(0, lenN);
  56.         int bias = lenN - lenQ;
  57.         System.out.println(spaces.substring(0, offsetLeft) + spaces.substring(0, bias) + quotient);
  58.         System.out.println(spaces.substring(0, offsetLeft - 2) + uline);
  59.         System.out.print("   " + strDenom + " ) " + strNumer);
  60.         String strTmpR = strNumer.substring(0, bias + 1);
  61.         BigInteger tmpR = new BigInteger(strTmpR);
  62.         BigInteger tmpSub = BigInteger.ZERO;
  63.         String oneDigit = null;
  64.         for (int i = 0; i < lenQ; i++) {
  65.             if (strQuotient.substring(i, i + 1).equals("0")) {
  66.                 if (i + 1 < lenQ) {
  67.                     oneDigit = strNumer.substring(bias + i + 1, bias + i + 2);
  68.                     System.out.print(oneDigit);
  69.                     strTmpR += oneDigit;
  70.                     tmpR = new BigInteger(strTmpR);
  71.                 }
  72.             }
  73.             else {
  74.                 System.out.println();
  75.                 tmpSub = new BigInteger(strQuotient.substring(i, i + 1)).multiply(denom);
  76.                 System.out.println(spaces.substring(0, offsetLeft) + simplify(tmpSub, bias + i + 1));
  77.                 System.out.println(spaces.substring(0, offsetLeft) + sline);
  78.                 tmpR = tmpR.subtract(tmpSub);
  79.                 if (tmpR.equals(BigInteger.ZERO) && i + 1 < lenQ) {
  80.                     System.out.print(spaces.substring(0, offsetLeft) + spaces.substring(0, bias + i + 1));
  81.                 }
  82.                 else {
  83.                     System.out.print(spaces.substring(0, offsetLeft) + simplify(tmpR, bias + i + 1));
  84.                 }
  85.                 strTmpR = "" + tmpR;
  86.                 if (i + 1 < lenQ) {
  87.                     oneDigit = strNumer.substring(bias + i + 1, bias + i + 2);
  88.                     System.out.print(oneDigit);
  89.                     strTmpR += oneDigit;
  90.                     tmpR = new BigInteger(strTmpR);
  91.                 }
  92.             }
  93.         }
  94.         System.out.println();
  95.         return tmpR;
  96.     }
  97.     public static void main(String[] args) {
  98.         if (args.length < 2) {
  99.             printUsage();
  100.             System.exit(1);
  101.         }
  102.         BigInteger a = null;
  103.         BigInteger b = null;
  104.         try {
  105.             a = new BigInteger(args[0]);
  106.             b = new BigInteger(args[1]);
  107.         }
  108.         catch (NumberFormatException ex) {
  109.             System.out.println("피제수: " + args[0] + ", 제수: " + args[1]);
  110.             System.out.println("숫자 입력에 오류가 있습니다.");
  111.             System.exit(1);
  112.         }
  113.         if (a.compareTo(BigInteger.ZERO) <= 0) {
  114.             System.out.println("피제수: " + a);
  115.             System.out.println("피제수는 양의 정수라야 합니다.");
  116.             System.exit(1);
  117.         }
  118.         else if (b.compareTo(BigInteger.ZERO) <=0) {
  119.             System.out.println("제수: " + b);
  120.             System.out.println("제수는 양의 정수라야 합니다.");
  121.             System.exit(1);
  122.         }
  123.         MakeDivisionTableApp app = new MakeDivisionTableApp();
  124.         BigInteger q = a.divide(b);
  125.         BigInteger r = a.mod(b);
  126.         System.out.print("나눗셈 " + a + " ÷ " + b + " 의 결과: ");
  127.         System.out.print("몫: " + q + ", ");
  128.         System.out.println("나머지: " + r);
  129.         System.out.println();
  130.         BigInteger k = app.makeTable(a, b, q);
  131.         if (k.equals(r)) {
  132.             System.out.println("\n나머지: " + k);
  133.         }
  134.         if (k.equals(BigInteger.ZERO)) {
  135.             System.out.println(a + " = " + b + " x " + q);
  136.             System.out.println(a + app.getSuffix(a) + " " + b + "의 배수(mupltiple)이다.");
  137.             System.out.println(b + app.getSuffix(b) + " " + a + "의 약수(divisor)이다.");
  138.         }
  139.         else {
  140.             System.out.println(a + " = " + b + " x " + q + " + " + r);
  141.             System.out.println(a + app.getSuffix(a) + " " + b + "의 배수(mupltiple)가 아니다.");
  142.         }
  143.     }
  144. }




실행> java MakeDivisionTableApp 500210 61

나눗셈 500210 ÷ 61 의 결과: 몫: 8200, 나머지: 10

          8200
      ________
   61 ) 500210
        488
        ------
         122
         122
        ------
            10

나머지: 10
500210 = 61 x 8200 + 10
500210은 61의 배수(mupltiple)가 아니다.




Creative Commons License

이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

Posted by Scripter
,