using System; class OctalNumber { private string value; public OctalNumber() { value = "0"; } public OctalNumber(string value) { SetValue(value); } public OctalNumber(OctalNumber other) { SetValue(other.value); } public string Value { get { return value; } set { SetValue(value); } } public int Length { get { return value.Length; } } public int this[int index] { get { if (index < 0 || index >= value.Length) { throw new IndexOutOfRangeException(); } return value[index] - '0'; } } public static OctalNumber operator+(OctalNumber a, OctalNumber b) { string result = ""; int carry = 0; for (int i = a.value.Length - 1, j = b.value.Length - 1; i >= 0 || j >= 0 || carry > 0; i--, j--) { int sum = (i >= 0 ? a.value[i] - '0' : 0) + (j >= 0 ? b.value[j] - '0' : 0) + carry; result = (sum % 8).ToString() + result; carry = sum / 8; } return new OctalNumber(result); } public static OctalNumber operator-(OctalNumber a, OctalNumber b) { if (a < b) { throw new ArgumentException("Cannot subtract a larger number from a smaller one."); } string result = ""; int borrow = 0; for (int i = a.value.Length - 1, j = b.value.Length - 1; i >= 0; i--, j--) { int diff = (i >= 0 ? a.value[i] - '0' : 0) - (j >= 0 ? b.value[j] - '0' : 0) - borrow; if (diff < 0) { diff += 8; borrow = 1; } else { borrow = 0; } result = diff.ToString() + result; } return new OctalNumber(result.TrimStart('0')); } public static OctalNumber operator*(OctalNumber a, OctalNumber b) { string result = "0"; for (int i = b.value.Length - 1; i >= 0; i--) { string lineResult = ""; int carry = 0; for (int j = a.value.Length - 1; j >= 0 || carry > 0; j--) { int product = (j >= 0 ? a.value[j] - '0' : 0) * (b.value[i] - '0') + carry; lineResult = (product % 8).ToString() + lineResult; carry = product / 8; } lineResult += new string('0', b.value.Length - i - 1); result = (new OctalNumber(lineResult) + new OctalNumber(result)).Value; } return new OctalNumber(result); } public static OctalNumber operator/(OctalNumber a, OctalNumber b) { if (b == new OctalNumber("0")) { throw new DivideByZeroException; } string result = ""; OctalNumber remainder = new OctalNumber(a); while (remainder >= b) { int quotientDigit = 0; OctalNumber quotientLine = new OctalNumber(); for (int i = remainder.Length - 1; i >= 0; i--) { quotientLine = new OctalNumber((quotientDigit * 10).ToString()) + new OctalNumber(remainder[i].ToString()) / b; if (quotientLine != new OctalNumber("0") || result != "") { result += quotientLine[0].ToString(); } quotientDigit = quotientLine[0]; } remainder = remainder - quotientLine * b; } if (result == "") { result = "0"; } return new OctalNumber(result); } public static bool operator==(OctalNumber a, OctalNumber b) { return a.value == b.value; } public static bool operator!=(OctalNumber a, OctalNumber b) { return a.value != b.value; } public static bool operator<(OctalNumber a, OctalNumber b) { if (a.Length < b.Length) { return true; } else if (a.Length > b.Length) { return false; } else { for (int i = 0; i < a.Length; i++) { if (a[i] < b[i]) { return true; } else if (a[i] > b[i]) { return false; } } return false; } } public static bool operator>(OctalNumber a, OctalNumber b) { if (a.Length > b.Length) { return true; } else if (a.Length < b.Length) { return false; } else { for (int i = 0; i < a.Length; i++) { if (a[i] > b[i]) { return true; } else if (a[i] < b[i]) { return false; } } return false; } } public static bool operator<=(OctalNumber a, OctalNumber b) { return a == b || a < b; } public static bool operator>=(OctalNumber a, OctalNumber b) { return a == b || a > b; } public static explicit operator int(OctalNumber a) { int result = 0; for (int i = 0; i < a.Length; i++) { result = result * 8 + a[i]; } return result; } public override string ToString() { return value; } private void SetValue(string value) { if (value == null) { throw new ArgumentNullException(); } foreach (char c in value) { if (c < '0' || c > '7') { throw new ArgumentException("Value must consist only of octal digits."); } } this.value = value.TrimStart('0'); if (this.value == "") { this.value = "0"; } } } class Program { static void Main(string[] args) { OctalNumber a = new OctalNumber("1234"); OctalNumber b = new OctalNumber c = new OctalNumber("765"); Console.WriteLine("a = {0}", a); Console.WriteLine("b = {0}", b); Console.WriteLine("c = {0}", c); Console.WriteLine(); Console.WriteLine("a + b = {0}", a + b); Console.WriteLine("a - b = {0}", a - b); Console.WriteLine("a * b = {0}", a * b); Console.WriteLine("a / c = {0}", a / c); Console.WriteLine(); Console.WriteLine("a == b: {0}", a == b); Console.WriteLine("a != b: {0}", a != b); Console.WriteLine("a < b: {0}", a < b); Console.WriteLine("a > b: {0}", a > b); Console.WriteLine("a <= b: {0}", a <= b); Console.WriteLine("a >= b: {0}", a >= b); Console.WriteLine(); Console.WriteLine("(int)a = {0}", (int)a); Console.WriteLine(); Console.WriteLine("a[0] = {0}", a[0]); Console.WriteLine("a[1] = {0}", a[1]); Console.WriteLine("a[2] = {0}", a[2]); Console.WriteLine("a[3] = {0}", a[3]); Console.ReadKey(); } } CSHARP using System; class OctalNumber { private string value; public OctalNumber() { value = "0"; } public OctalNumber(string value) { SetValue(value); } public OctalNumber(OctalNumber other) { SetValue(other.value); } public string Value { get { return value; } set { SetValue(value); } } public int Length { get { return value.Length; } } public int this[int index] { get { if (index < 0 || index >= value.Length) { throw new IndexOutOfRangeException(); } return value[index] - '0'; } } public static OctalNumber operator+(OctalNumber a, OctalNumber b) { string result = ""; int carry = 0; for (int i = a.value.Length - 1, j = b.value.Length - 1; i >= 0 || j >= 0 || carry > 0; i--, j--) { int sum = (i >= 0 ? a.value[i] - '0' : 0) + (j >= 0 ? b.value[j] - '0' : 0) + carry; result = (sum % 8).ToString() + result; carry = sum / 8; } return new OctalNumber(result); } public static OctalNumber operator-(OctalNumber a, OctalNumber b) { if (a < b) { throw new ArgumentException("Cannot subtract a larger number from a smaller one."); } string result = ""; int borrow = 0; for (int i = a.value.Length - 1, j = b.value.Length - 1; i >= 0; i--, j--) { int diff = (i >= 0 ? a.value[i] - '0' : 0) - (j >= 0 ? b.value[j] - '0' : 0) - borrow; if (diff < 0) { diff += 8; borrow = 1; } else { borrow = 0; } result = diff.ToString() + result; } return new OctalNumber(result.TrimStart('0')); } public static OctalNumber operator*(OctalNumber a, OctalNumber b) { string result = "0"; for (int i = b.value.Length - 1; i >= 0; i--) { string lineResult = ""; int carry = 0; for (int j = a.value.Length - 1; j >= 0 || carry > 0; j--) { int product = (j >= 0 ? a.value[j] - '0' : 0) * (b.value[i] - '0') + carry; lineResult = (product % 8).ToString() + lineResult; carry = product / 8; } lineResult += new string('0', b.value.Length - i - 1); result = (new OctalNumber(lineResult) + new OctalNumber(result)).Value; } return new OctalNumber(result); } public static OctalNumber operator/(OctalNumber a, OctalNumber b) { if (b == new OctalNumber("0")) { throw new DivideByZeroException; } string result = ""; OctalNumber remainder = new OctalNumber(a); while (remainder >= b) { int quotientDigit = 0; OctalNumber quotientLine = new OctalNumber(); for (int i = remainder.Length - 1; i >= 0; i--) { quotientLine = new OctalNumber((quotientDigit * 10).ToString()) + new OctalNumber(remainder[i].ToString()) / b; if (quotientLine != new OctalNumber("0") || result != "") { result += quotientLine[0].ToString(); } quotientDigit = quotientLine[0]; } remainder = remainder - quotientLine * b; } if (result == "") { result = "0"; } return new OctalNumber(result); } public static bool operator==(OctalNumber a, OctalNumber b) { return a.value == b.value; } public static bool operator!=(OctalNumber a, OctalNumber b) { return a.value != b.value; } public static bool operator<(OctalNumber a, OctalNumber b) { if (a.Length < b.Length) { return true; } else if (a.Length > b.Length) { return false; } else { for (int i = 0; i < a.Length; i++) { if (a[i] < b[i]) { return true; } else if (a[i] > b[i]) { return false; } } return false; } } public static bool operator>(OctalNumber a, OctalNumber b) { if (a.Length > b.Length) { return true; } else if (a.Length < b.Length) { return false; } else { for (int i = 0; i < a.Length; i++) { if (a[i] > b[i]) { return true; } else if (a[i] < b[i]) { return false; } } return false; } } public static bool operator<=(OctalNumber a, OctalNumber b) { return a == b || a < b; } public static bool operator>=(OctalNumber a, OctalNumber b) { return a == b || a > b; } public static explicit operator int(OctalNumber a) { int result = 0; for (int i = 0; i < a.Length; i++) { result = result * 8 + a[i]; } return result; } public override string ToString() { return value; } private void SetValue(string value) { if (value == null) { throw new ArgumentNullException(); } foreach (char c in value) { if (c < '0' || c > '7') { throw new ArgumentException("Value must consist only of octal digits."); } } this.value = value.TrimStart('0'); if (this.value == "") { this.value = "0"; } } } class Program { static void Main(string[] args) { OctalNumber a = new OctalNumber("1234"); OctalNumber b = new OctalNumber c = new OctalNumber("765"); Console.WriteLine("a = {0}", a); Console.WriteLine("b = {0}", b); Console.WriteLine("c = {0}", c); Console.WriteLine(); Console.WriteLine("a + b = {0}", a + b); Console.WriteLine("a - b = {0}", a - b); Console.WriteLine("a * b = {0}", a * b); Console.WriteLine("a / c = {0}", a / c); Console.WriteLine(); Console.WriteLine("a == b: {0}", a == b); Console.WriteLine("a != b: {0}", a != b); Console.WriteLine("a < b: {0}", a < b); Console.WriteLine("a > b: {0}", a > b); Console.WriteLine("a <= b: {0}", a <= b); Console.WriteLine("a >= b: {0}", a >= b); Console.WriteLine(); Console.WriteLine("(int)a = {0}", (int)a); Console.WriteLine(); Console.WriteLine("a[0] = {0}", a[0]); Console.WriteLine("a[1] = {0}", a[1]); Console.WriteLine("a[2] = {0}", a[2]); Console.WriteLine("a[3] = {0}", a[3]); Console.ReadKey(); } }