---
# System prepended metadata

title: Funny Encryption Method(UVA10019)
tags: [CPE一顆星必考題]

---

# Funny Encryption Method(UVA10019)
## [程式繳交區](https://hackmd.io/@Renektonn/Byj5hYxdkg/edit)
## 題目
[點我](https://onlinejudge.org/external/100/10019.pdf)

## 解題網站
[UVA](https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=960)
[ZJ](https://zerojudge.tw/ShowProblem?problemid=e545)

## hint
根據計算機概論可知:
16進位可以直接轉為2進位，舉例來說:
265~(16)~ = 0010 0110 0101~(2)~
0010是2的2進位、0110是6的2進位、0101是5的2進位
所以用個迴圈，將n拆成1個個digit，再分別放入getB，將結果加到b2裡。
$$ b2 = \sum{getB(n的每個digit)} $$

```cpp=
int b2 = 0;
while(n > 0){
    b2 += getB(n % 10);
    n /= 10;
}
```

## 上課的演算法
```
1. 輸入n
2. 重複n次，輸入str
3. 掃過str，將每個字元轉為10進位，再丟到toBinary()函式，轉為2進位，最後
統計2進位中有幾個1
```

## 演算法
```
1. 輸入t
2. 重複t次
2.1 輸入n
2.2 將n從十進位轉為二進位，看它有幾個1，即為b1
2.3 將n從十六進位轉為二進位，看它有幾個1，即為b2
2.4 輸出b1 b2

十進位轉二進位
1. 輸入n
2. 當n大於0
2.1 將n%2存到陣列ans
2.2 n除以2
3. 將ans反轉，即為答案

十六進位轉為二進位
1. 輸入n
2. 讓'A'代表10，'B'代表11，...，'F'代表15
3. 對於n的每個digit，將它先對應到十進位的數字，再用十進位轉二進位的方法轉換
4. 將3的轉換結果合併起來

在此題，不用擔心十六進位會有字母，因為它也可視為十進位
```

## 程式碼

```cpp=
#include <bits/stdc++.h>
using namespace std;

int getB (int n) {
    int ans = 0;
    while (n > 0) {
        ans += n % 2;
        n /= 2;
    }
    return ans;
}

int main() {
    int t;
    cin >> t;
    for (int i = 1; i <= t; i++) {
        int n;
        cin >> n;
        int b1 = getB(n), b2 = 0;
        while (n > 0) {
            b2 += getB(n % 10);
            n /= 10;
        }        
        cout << b1 << " " << b2 << endl;
    }
    return 0;
}

```

