[CPE一星49題] UVA10019 - Funny Encryption Method 題目解析與實作


編輯製作:
 蔡豐聲、莊祺仁 

單位: 中國醫藥大學 醫療資訊學系 程式俱樂部

 YT: https://youtu.be/nThbxeAACRo

## 題目資訊

  • 題目名稱: Funny Encryption Method
  • 編號: CPE10403, UVA10019 

## 題目解析

本題要求對一個整數 $N$ 進行特殊的二進位轉換計算。給定一個正整數 $N$,我們需要根據兩種不同的解讀方式來計算其二進位表示法中「1」的個數。

  • 計算 $b1$ (十進位解讀):
  1. 將 $N$ 視為一個十進位整數。
  2. 將其轉換為二進位格式。
  3. 統計二進位字串中「1」出現的次數。
  • 計算 $b2$ (十六進位解讀):
  1. 將 $N$ 視為一個十六進位整數(即 $N_{16}$)。
  2. 將其轉換為二進位格式。
  3. 統計二進位字串中「1」出現的次數。

## 輸入說明

  • 第一行包含一個整數 $T$,代表測試資料的組數。

  • 接下來的 $T$ 行,每行包含一個整數 $N$

## 輸出說明

  • 對於每一組測資,輸出兩個整數 $b1$ 和 $b2$,中間以一個空格分隔。

## 範例測試

  • 輸入:
                 3
                 265
                 111
                 1234
  • 輸出:
                 3 5
                 3 3
                 5 5

## 解題思路

  • 進位轉換處理:
  1. 在 Python 中,可以使用 int(string, base) 函數。
  2. 當 base=10(預設),將字串轉為十進位整數。
  3. 當 base=16,將字串轉為十六進位整數。
  • 二進位統計:
  1. 使用 bin() 函數將整數轉換為 '0b...' 開頭的二進位字串(例如 bin(10) 會得到 '0b1010')。
  2. 利用字串方法 .count('1') 即可快速算出 1 的個數。
  • 解析 (以 265 為例):
  1. $265_{10} = 100001001_2$ $\rightarrow$ 有 3 個 1 ($b1=3$)。
  2. $265_{16} = 2 \times 16^2 + 6 \times 16^1 + 5 \times 16^0 = 613_{10} = 1001100101_2$ $\rightarrow$ 有 5 個 1 ($b2=5$)

## 實作程式碼 (Python)

# 讀數總個數
time = int(input())
for _ in range(time):
    n = 0
    x = 0
    code = (input())
    
    # 方式 1:字串轉十進位整數再轉二進位字串
    n = bin(int(code))[2:]
    n = n.count('1')
    
    # 方式 2:字串轉十六進位整數
    x = int(code, 16)
    # 十六進位整數轉二進位字串
    x = bin(x)[2:]
    x = x.count("1")
    
    print(n, x)