[CPE一星49題] UVA10019 - Funny Encryption Method 題目解析與實作
編輯製作: 蔡豐聲、莊祺仁
單位: 中國醫藥大學 醫療資訊學系 程式俱樂部
YT: https://youtu.be/nThbxeAACRo
## 題目資訊
- 題目名稱: Funny Encryption Method
- 編號: CPE10403, UVA10019
- 相關平台: Zero Judge, Online Judge
## 題目解析
本題要求對一個整數 $N$ 進行特殊的二進位轉換計算。給定一個正整數 $N$,我們需要根據兩種不同的解讀方式來計算其二進位表示法中「1」的個數。
- 計算 $b1$ (十進位解讀):
- 將 $N$ 視為一個十進位整數。
- 將其轉換為二進位格式。
- 統計二進位字串中「1」出現的次數。
- 計算 $b2$ (十六進位解讀):
- 將 $N$ 視為一個十六進位整數(即 $N_{16}$)。
- 將其轉換為二進位格式。
- 統計二進位字串中「1」出現的次數。
## 輸入說明
- 第一行包含一個整數 $T$,代表測試資料的組數。
- 接下來的 $T$ 行,每行包含一個整數 $N$。
## 輸出說明
- 對於每一組測資,輸出兩個整數 $b1$ 和 $b2$,中間以一個空格分隔。
## 範例測試
- 輸入:
3
265
111
1234
- 輸出:
3 5
3 3
5 5
## 解題思路
- 進位轉換處理:
- 在 Python 中,可以使用
int(string, base)函數。 - 當 base=10(預設),將字串轉為十進位整數。
- 當 base=16,將字串轉為十六進位整數。
- 二進位統計:
- 使用
bin()函數將整數轉換為 '0b...' 開頭的二進位字串(例如 bin(10) 會得到 '0b1010')。 - 利用字串方法 .count('1') 即可快速算出 1 的個數。
- 解析 (以 265 為例):
- $265_{10} = 100001001_2$ $\rightarrow$ 有 3 個 1 ($b1=3$)。
- $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)