Pythonで、n進法を用いて四則演算ができる計算機を作ってみた

### 前置き
以前、10進法を用いて四則演算ができる計算機のプログラムコードを紹介した。
今回はn進法を用いて四則演算ができる計算機を作成するためのプログラムコードを紹介したい。

### n進法とは
N個の記号を使って数字を表す方法である。
例えば、9進法においては、0,1,2,3,4,5,6,7,8の9種類の記号の数字が表されている。
私たちは一般的には10進法、0,1,2,3,4,5,6,7,8の10種類の記号の数字を用いている。
引用元：https://manabitimes.jp/math/1544

### プログラムコード
``` python
def to_base_n(number, base):
  if number == 0:
      return '0'
  digits = []
  while number:
      digits.append(int(number % base))
      number //= base
  return ''.join(str(x) for x in digits[::-1])

def from_base_n(number_str, base):
  number = 0
  for digit in number_str:
      number = number * base + int(digit, base)
  return number

def calculate_in_base_n(num1, num2, base, operation):
  n1 = from_base_n(num1, base)
  n2 = from_base_n(num2, base)

  if operation == '+':
      result = n1 + n2
  elif operation == '-':
      result = n1 - n2
  elif operation == '*':
      result = n1 * n2
  elif operation == '/':
      result = n1 // n2
  elif operation == '**':
      result = n1 ** n2   
  else:
      raise ValueError("無効な操作です。+、-、*、/のいずれかを使用してください。")

  return to_base_n(result, base)

def main():
  base = int(input("基数 (n進法) を入力してください: "))
  num1 = input(f"最初の数 (基数 {base}) を入力してください: ")
  num2 = input(f"2つ目の数 (基数 {base}) を入力してください: ")
  operation = input("操作を入力してください (+, -, *, /): ")

  result = calculate_in_base_n(num1, num2, base, operation)
  print(f"結果: {result} (基数 {base})")

if __name__ == "__main__":
  main()
```
### 出力結果
``` python
基数 (n進法) を入力してください: 9
最初の数 (基数 9) を入力してください: 120
2つ目の数 (基数 9) を入力してください: 130
操作を入力してください (+, -, *, /, sqrt): +
結果: 250 (基数 9)
```
ここでは、ユーザーがn進法を選び、ユーザが選んだ2数の四則演算の結果が出力される。


ユーザがn進法で2数を選び、その結果を10進法で表すのはできないだろうかと思い、
プログラムコードを改良してみた。
### 改良したプログラムコード
``` python
　import math

def from_base_n(number_str, base):
    number = 0
    for digit in number_str:
        number = number * base + int(digit, base)
    return number

def calculate_in_base_n(num1, num2, base, operation):
    n1 = from_base_n(num1, base)
    n2 = from_base_n(num2, base) if num2 else 0

    if operation == '+':
        result = n1 + n2
    elif operation == '-':
        result = n1 - n2
    elif operation == '*':
        result = n1 * n2
    elif operation == '/':
        result = n1 // n2
    elif operation == 'sqrt':
        result = int(math.sqrt(n1))
    else:
        raise ValueError("無効な操作です。+, -, *, /, sqrt のいずれかを使用してください。")

    return result

def main():
    base = int(input("基数 (n進法) を入力してください: "))
    num1 = input(f"最初の数 (基数 {base}) を入力してください: ")
    operation = input("操作を入力してください (+, -, *, /, sqrt): ")

    if operation == 'sqrt':
        num2 = None  # sqrtの場合は2つ目の数は不要
    else:
        num2 = input(f"2つ目の数 (基数 {base}) を入力してください: ")

    result = calculate_in_base_n(num1, num2, base, operation)
    print(f"結果: {result} (10進法)")

if __name__ == "__main__":
    main()
```
### 出力結果
``` python
基数 (n進法) を入力してください: 5
最初の数 (基数 5) を入力してください: 20
操作を入力してください (+, -, *, /, sqrt): +
2つ目の数 (基数 5) を入力してください: 30
結果: 25 (10進法)
基数 (n進法) を入力してください: 7
最初の数 (基数 7) を入力してください: 42
操作を入力してください (+, -, *, /, sqrt): *
2つ目の数 (基数 7) を入力してください: 10
結果: 210 (10進法)
基数 (n進法) を入力してください: 8
最初の数 (基数 8) を入力してください: 20
操作を入力してください (+, -, *, /, sqrt): -
2つ目の数 (基数 8) を入力してください: 7
結果: 9 (10進法)
基数 (n進法) を入力してください: 6
最初の数 (基数 6) を入力してください: 32
操作を入力してください (+, -, *, /, sqrt): /
2つ目の数 (基数 6) を入力してください: 4
結果: 5 (10進法)
```
1つ目の出力結果：
20 + 30 = 50
5進法のため、10進法に変換するには、5x5 +1x0 = 25になる。
2つ目の出力結果：
42 x 10 = 420
7進法のため、10進法に変換するには、4x49 +2x7 = 210になる。
3つ目の出力結果：
20 - 7 = 13
8進法のため、10進法に変換するには、8x2+1x0 - 1x7 = 16-7 = 9になる。
4つ目の出力結果
32 / 4 = 8
6進法のため、10進法に変換するには、6x3+1x2 / 1x4 = 20 / 4 = 5になる。

このように、ちゃんとユーザーが、n進法を選択し、2数を選び、四則演算をした結果が、10進法として出力されている。

皆さんも時間がある時にこのプログラムコードを参考に、n進法で2数の四則演算をして、その結果を10進法に変換してみてはいかがでしょうか。