課題

課題#

課題 1#

次の二つのプログラムの違いを探せ

%%ai vioras
与えられた2つの整数を十進法位取り記法による文字列に変換し足し算をプログラミングする

あなたが求めているのは、与えられた2つの整数を文字列として扱い、それらを十進法位取り記法に基づいて加算するという理解でよろしいでしょうか?

その場合、それぞれの数字を文字列に変換し、各桁を逆順にしてから加算を行い、最後に結果を再び逆順にするという手順を踏むことで、この問題を解決することができます。

以下にそのような関数を示します:

def add_two_numbers_str(num1, num2):
    # 数字を文字列に変換し、逆順にする
    num1 = str(num1)[::-1]
    num2 = str(num2)[::-1]
    
    # 2つの数の長さを揃える
    max_len = max(len(num1), len(num2))
    num1 = num1.ljust(max_len, '0') 
    num2 = num2.ljust(max_len, '0')
    
    carry = 0
    result = ''

    for i in range(max_len):
        temp = int(num1[i]) + int(num2[i]) + carry
        result += str(temp % 10)
        carry = temp // 10

    if carry > 0:
        result += str(carry)
    
    # 結果を逆順にして返す
    return result[::-1]

# テストする
print(add_two_numbers_str(123, 456))  # Output: "579"

この関数は、2つの整数を引数として受け取り、それらを文字列として扱います。それぞれの数字を逆順にし、各桁を加算します。桁上がりがある場合は次の桁の加算に持ち越します。最終的な結果を得るために、得られた文字列を再び逆順にします。

%%ai vioras
与えられた2つの整数を二進法位取り記法による文字列に変換し足し算をプログラミングする

二進法位取り記法に基づいて2つの整数を加算するためのプログラムを作成したい場合、次の手順を踏むことができます:

  1. まず、2つの整数を二進数(文字列形式)に変換します。

  2. それから、それぞれの二進数を逆順にします(低位から処理を開始するため)。

  3. 各位を加算します。桁上がり(もし存在すれば)を次の位の加算に持ち越します。

  4. 最後に、結果を再び逆順にして正しい順序に戻します。

以下に、そのような関数を示します:

def add_two_binary_numbers(num1, num2):
    # 数字を二進数の文字列に変換し、逆順にする
    num1 = bin(num1)[2:][::-1]
    num2 = bin(num2)[2:][::-1]
    
    # 2つの数の長さを揃える
    max_len = max(len(num1), len(num2))
    num1 = num1.ljust(max_len, '0')
    num2 = num2.ljust(max_len, '0')
    
    carry = 0
    result = ''

    for i in range(max_len):
        temp = int(num1[i]) + int(num2[i]) + carry
        result += str(temp % 2)
        carry = temp // 2

    if carry > 0:
        result += str(carry)
    
    # 結果を逆順にして返す
    return result[::-1]

# テストする
print(add_two_binary_numbers(5, 3))  # Output: "1000"

この関数は、2つの整数を引数として受け取り、それらを二進数の文字列として扱います。それぞれの数字を逆順にし、各桁を加算します。桁上がりがある場合は次の桁の加算に持ち越します。最終的な結果を得るために、得られた文字列を再び逆順にします。

テストケースでは、5は二進数で101、3は二進数で11です。これらを加算すると1000(8 in decimal)を得ます。

参考#

num1, num2 = 123, 45

num1 = str(num1)[::-1]
num2 = str(num2)[::-1]

max_len = max(len(num1), len(num2))

num1 = num1.ljust(max_len, '0')
num2 = num2.ljust(max_len, '0')
num1, num2
('321', '540')
str?
Init signature: str(self, /, *args, **kwargs)
Docstring:     
str(object='') -> str
str(bytes_or_buffer[, encoding[, errors]]) -> str

Create a new string object from the given object. If encoding or
errors is specified, then the object must expose a data buffer
that will be decoded using the given encoding and error handler.
Otherwise, returns the result of object.__str__() (if defined)
or repr(object).
encoding defaults to sys.getdefaultencoding().
errors defaults to 'strict'.
Type:           type
Subclasses:     StrEnum, DeferredConfigString, _rstr, _ScriptTarget, _ModuleTarget, LSString, include, Keys, InputMode, ColorDepth, ...
help(''.ljust)
Help on built-in function ljust:

ljust(width, fillchar=' ', /) method of builtins.str instance
    Return a left-justified string of length width.
    
    Padding is done using the specified fill character (default is a space).
num1, num2 = 123, 45

num1 = bin(num1)[2:][::-1]
num2 = bin(num2)[2:][::-1]

max_len = max(len(num1), len(num2))

num1 = num1.ljust(max_len, '0')
num2 = num2.ljust(max_len, '0')
num1, num2
('1101111', '1011010')
bin?
Signature: bin(number, /)
Docstring:
Return the binary representation of an integer.

>>> bin(2796202)
'0b1010101010101010101010'
Type:      builtin_function_or_method

課題 2#

上のプログラムと次のプログラムの違いを探せ

  • プログラムの違いがわかった箇所が何故同じ結果になるか考えてみよ

%%ai vioras
与えられた2つの整数を二進法位取り記法による文字列に変換し足し算をプログラミングする。その際、ブール代数の論理演算を使う

ブール代数を使用して2つの二進数を加算するためには、XOR(排他的論理和)、AND(論理積)、および左シフト演算を使用します。XORは2つのビットの加算(桁上がりなし)を計算し、ANDと左シフトは桁上がりを計算します。

以下にPythonでの実装例を示します。

def add_two_binary_numbers(num1, num2):
    # 数字を二進数の文字列に変換する
    num1 = bin(num1)[2:]
    num2 = bin(num2)[2:]
    
    # 2つの数の長さを揃える
    max_len = max(len(num1), len(num2))
    num1 = num1.zfill(max_len)
    num2 = num2.zfill(max_len)
    
    result = ''
    carry = 0

    for i in range(max_len-1, -1, -1):
        bit1 = int(num1[i])
        bit2 = int(num2[i])
        
        # XOR演算で各ビットを加算する
        sum_bit = bit1 ^ bit2 ^ carry
        
        # ANDと左シフト演算で桁上がりを計算する
        carry = (bit1 & bit2) | (carry & (bit1 ^ bit2))
        
        result = str(sum_bit) + result

    if carry != 0 :
        result = str(carry) + result

    return result

# テストする
print(add_two_binary_numbers(5, 3))  # Output: "1000"

この関数は、2つの整数を引数として受け取り、それらを二進数の文字列として扱います。それぞれの数字の各ビットを右から左へと順に処理し、各ビットを加算します。桁上がりがある場合は次のビットの加算に持ち越します。最終的な結果を得るために、得られた文字列を逆順にします。

テストケースでは、5は二進数で101、3は二進数で11です。これらを加算すると1000(8 in decimal)を得ます。