다음은 초등학교에서 배우는 나눗셈 계산표를 만들어주는 C# 소스 코드이다.
나눗셈 계산표를 완성하고 나서 약수, 배수 관계를 알려준다.
- /*
- * Filename: MakeDivisionTableApp.cs
- *
- * Purpose: Make a division table in a handy written form.
- *
- * Compile: csc MakeDivisionTableApp.cs BigInteger.cs
- *
- * Execute: MakeDivisionTableApp 12345 32
- * MakeDivisionTableApp 500210 61
- *
- * Date: 2009/01/24
- * Author: PH Kim [ pkim ((AT)) scripts.pe.kr ]
- */
- using System;
- // using System.Numeric; // only for C# 3.0 above
- using ScottGarland; // for C# 2.0 Get at http://www.codeplex.com/biginteger/Release/ProjectReleases.aspx?ReleaseId=16762
- namespace MyTestApplication1 {
- public class MakeDivisionTableApp {
- public static BigInteger ZERO = new BigInteger("0");
- public static void printUsage() {
- // Console.WriteLine("Using: MakeDivisionTableApp [numerator] [denominator]");
- // Console.WriteLine("Make a division table in a handy written form.");
- Console.WriteLine("사용법: MakeDivisionTableApp [피제수] [제수]");
- Console.WriteLine("손으로 작성한 형태의 나눗셈 표를 만들어준다.");
- }
- public static String simplify(double v) {
- String t = "" + v;
- if (t.EndsWith(".0"))
- t = t.Substring(0, t.Length - 2);
- return t;
- }
- public static String simplify(BigInteger v, int width) {
- String t = "" + v;
- if (t.EndsWith(".0"))
- t = t.Substring(0, t.Length - 2);
- int len = t.Length;
- if (len < width)
- t = " ".Substring(0, width - len) + t;
- return t;
- }
- public String getSuffix(BigInteger v) {
- BigInteger t = BigInteger.Modulus(v, new BigInteger("10"));
- String suffix = "은";
- if ("2459".IndexOf("" + t) >= 0) {
- suffix = "는";
- }
- return suffix;
- }
- public BigInteger makeTable(BigInteger numer, BigInteger denom, BigInteger quotient) {
- String strNumer = "" + numer;
- String strDenom = "" + denom;
- String strQuotient = "" + quotient;
- int lenN = strNumer.Length;
- int lenD = strDenom.Length;
- int lenQ = strQuotient.Length;
- int offsetLeft = 3 + lenD + 3;
- String spaces = " ";
- String uline = "_________________________________________________________________________________".Substring(0, lenN + 2);
- String sline = "---------------------------------------------------------------------------------".Substring(0, lenN);
- int bias = lenN - lenQ;
- Console.WriteLine(spaces.Substring(0, offsetLeft) + spaces.Substring(0, bias) + quotient);
- Console.WriteLine(spaces.Substring(0, offsetLeft - 2) + uline);
- Console.Write(" " + strDenom + " ) " + strNumer);
- String strTmpR = strNumer.Substring(0, bias + 1);
- BigInteger tmpR = new BigInteger(strTmpR);
- BigInteger tmpSub = ZERO;
- String oneDigit = null;
- for (int i = 0; i < lenQ; i++) {
- if (strQuotient.Substring(i, 1).Equals("0")) {
- if (i + 1 < lenQ) {
- oneDigit = strNumer.Substring(bias + i + 1, 1);
- Console.Write(oneDigit);
- strTmpR += oneDigit;
- tmpR = new BigInteger(strTmpR);
- }
- }
- else {
- Console.WriteLine();
- tmpSub = BigInteger.Multiply(new BigInteger(strQuotient.Substring(i, 1)), denom);
- Console.WriteLine(spaces.Substring(0, offsetLeft) + simplify(tmpSub, bias + i + 1));
- Console.WriteLine(spaces.Substring(0, offsetLeft) + sline);
- tmpR = BigInteger.Subtract(tmpR, tmpSub);
- if (tmpR.Equals(ZERO) && i + 1 < lenQ) {
- Console.Write(spaces.Substring(0, offsetLeft) + spaces.Substring(0, bias + i + 1));
- }
- else {
- Console.Write(spaces.Substring(0, offsetLeft) + simplify(tmpR, bias + i + 1));
- }
- strTmpR = "" + tmpR;
- if (i + 1 < lenQ) {
- oneDigit = strNumer.Substring(bias + i + 1, 1);
- Console.Write(oneDigit);
- strTmpR += oneDigit;
- tmpR = new BigInteger(strTmpR);
- }
- }
- }
- Console.WriteLine();
- return tmpR;
- }
- public static void Main(String[] args) {
- if (args.Length < 2) {
- printUsage();
- Environment.Exit(1);
- }
- BigInteger a = null;
- BigInteger b = null;
- try {
- a = new BigInteger(args[0]);
- b = new BigInteger(args[1]);
- }
- catch (ArgumentOutOfRangeException ex) {
- Console.WriteLine(ex);
- Console.WriteLine("피제수: " + args[0] + ", 제수: " + args[1]);
- Console.WriteLine("숫자 입력에 오류가 있습니다.");
- Environment.Exit(1);
- }
- catch (ArgumentNullException ex) {
- Console.WriteLine(ex);
- }
- catch (FormatException ex) {
- Console.WriteLine(ex);
- Console.WriteLine("피제수: " + args[0] + ", 제수: " + args[1]);
- Console.WriteLine("숫자 입력에 오류가 있습니다.");
- Environment.Exit(1);
- }
- if (BigInteger.Compare(a, ZERO) <= 0) {
- Console.WriteLine("피제수: " + a);
- Console.WriteLine("피제수는 양의 정수라야 합니다.");
- Environment.Exit(1);
- }
- else if (BigInteger.Compare(b, ZERO) <= 0) {
- Console.WriteLine("제수: " + b);
- Console.WriteLine("제수는 양의 정수라야 합니다.");
- Environment.Exit(1);
- }
- MakeDivisionTableApp app = new MakeDivisionTableApp();
- BigInteger q = BigInteger.Divide(a, b);
- BigInteger r = BigInteger.Modulus(a, b);
- Console.Write("나눗셈 " + a + " ÷ " + b + " 의 결과: ");
- Console.Write("몫: " + q + ", ");
- Console.WriteLine("나머지: " + r);
- Console.WriteLine();
- BigInteger k = app.makeTable(a, b, q);
- Console.WriteLine();
- if (k.Equals(r)) {
- Console.WriteLine("나머지: " + k);
- }
- if (k.Equals(ZERO)) {
- Console.WriteLine(a + " = " + b + " x " + q);
- Console.WriteLine(a + app.getSuffix(a) + " " + b + "의 배수(mupltiple)이다.");
- Console.WriteLine(b + app.getSuffix(b) + " " + a + "의 약수(divisor)이다.");
- }
- else {
- Console.WriteLine(a + " = " + b + " x " + q + " + " + r);
- Console.WriteLine(a + app.getSuffix(a) + " " + b + "의 배수(mupltiple)가 아니다.");
- }
- }
- }
- }
실행> MakeDivisionTableApp 500210 61
나눗셈 500210 ÷ 61 의 결과: 몫: 8200, 나머지: 10 8200 ________ 61 ) 500210 488 ------ 122 122 ------ 10 나머지: 10 500210 = 61 x 8200 + 10 500210은 61의 배수(mupltiple)가 아니다.
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
'프로그래밍 > C#' 카테고리의 다른 글
손으로 계산하는 긴자리 곱셈표 만들기 with C# (0) | 2009.03.07 |
---|---|
문자열 거꾸로 하기 with C# (0) | 2009.01.25 |
클래스 상속(subclassing) 예제 with C# (0) | 2009.01.24 |
삼각형 출력 예제를 통한 여러 가지 소스 비교 with C# (0) | 2009.01.24 |
7비트 ASCII 코드표 만들기 예제 with C# (0) | 2009.01.19 |