⌨️

数の分類・文字式・2進方

2024/04/28に公開

対象者

  • アルゴリズムに興味がある人
  • 数学に興味ある人

やること/やらないこと

やること:
Pythonを使ってアルゴリズムの問題を解いていく。

やらないこと:
コードの詳しい説明はしません。

プロジェクトの説明

合計数:
りんごが5個あり、みかんがN個あります。整数Nが与えられるので、りんごとみかんを合わせて何個あるかを出力するプログラムを作成してください。

プログラムを実行して、ターミナルで数字を入力すると実行できる。

N = int(input())
print(5 + N)

多くの値が入力される場合:
3つの整数A1 + A2 + A3が与えられます。
A1 + A2 + A3を出力するプログラムを作成してください。

プログラムを実行して、ターミナルで半角スペースを開けて、数字を3回入力すると実行できる。

A = list(map(int, input().split()))
print(A[0] + A[1] + A[2])

A1 + A2 + A3 + A4 + A5を与えて値を出力する場合:

プログラムを実行して、1回数値を入力して、ターミナルで半角スペースを開けて、数字を4回入力すると実行できる。

N = int(input())
A = list(map(int, input().split()))
Answer = 0

for item in A:
    Answer += item

print(Answer)

2進法->10進法の変換:
2進法を10進法に変換するにはどうすればいいのか?
0〜1つづつ足していくと時間がかかってしまいますが、位の性質を使うと、効率的に変換できるそうです。
一の位、十の位、百の位、千の位といったように桁がつけられ「位とその桁の数の掛け算」の合計が元々の整数になります。出力される値が、314、2037の場合の例だと以下のようになります。

10進法:

# 314の場合
x = 100 * 3
y = 10 * 1
z = 1 * 4
result = 300 + 10 + 4
print(result)

# 2037の場合
a = 1000 * 2
b = 100 * 0
c = 10 * 3
d = 1 * 7
result = 2000 + 0 + 30 + 7
print(result)

2進法も同じような仕組みで動いている。1を倍倍していくと、1->2->4->8->・・・となるので、1の位、2の位、4の位、8の位、といったように桁に位をつけると考えましょう。「位とその桁の数の掛け算」の合計が2進法を10進法にに変換した値になります。
例えば1011を10進法に変換した値は11、111000を10進法にした値は28です。

2進法:

# 1011の場合
# 8の位、4の位、2の位、1の位の順に、1が立っているかどうかを調べる
a = 8 * 1
b = 4 * 0
c = 2 * 1
d = 1 * 1
result = a + b + c + d
print(result)# 11

# 111000の場合
# 16の位、8の位、4の位、2の位、1の位の順に、1が立っているかどうかを調べる
a = 16 * 1
b = 8 * 1
c = 4 * 1
d = 2 * 0
e = 1 * 0
result = a + b + c + d + e
print(result)# 28

感想

アルゴリズムなるものに興味がでてロジックを書いてみました。本の問題だと、C++だったので仕事で使ったことあるPythonの方が理解できるので、ロジックを書いてみました。普段書いてるコードは、Dartなので同じように動くロジックも書いてみました。

5 + N個の数値を出力:

void main() {
  String N = "5";
  final np = int.parse(N);
  print(5 + np);// 10
}

Listから値を取り出して3個出力:

void main() {
  List<String> i = ["1", "2", "3"];
  final o = i.map((e) => e.split("")).toList();
  print(o);// [[1], [2], [3]]
}

これは説明が長い。6になるまで計算するだけのロジックなのですが解説が必要そう。

void main() {
  List<String> l = ["1", "2", "3"];
  final o = l.map((e) => e.split("")).toList();
  int answer = 0;// input: 0

  for(var i in o) {
    // 0 + 1 + 2 + 3 = 6
    answer += int.parse(i[0]);
  }

  print(answer);// output: 6
}

このコードでは、iの各要素をStringとして扱い、それをintに変換してanswerに加算します。最後に、合計値を出力します。

このDartコードは、文字列のリストiの各要素を整数に変換し、それらを合計しています。

リストiは["1", "2", "3"]という3つの要素を持っています。これらの要素はすべて文字列ですが、int.parse(item)によって整数に変換されます。

その後、answer += int.parse(item);によって、変換された整数がanswerに加算されます。

初期状態ではanswerは0です。その後、リストiの各要素("1", "2", "3")が順に加算されます。

したがって、合計は 0 + 1 + 2 + 3 = 6 となります。これがprint(answer);によって出力される値です。

Discussion