---
# System prepended metadata

title: HW2
tags: [CSE]

---

---
tags: CSE
---
# HW2
## 題目說明
Objective :
學會使用 C 函式 scanf 輸入訊息、printf 輸出訊息及基本
數學運算。

### 2-1
設計一個程式，在輸入一介於 1－999 之間的數字後，計算
並輸出可用多少個 100、50、10、5、1 元貨幣組合而成。
Input : 963
Output : 
![](https://i.imgur.com/GVaxZja.png =50%x)

### 2-2
設計一個程式，在輸入一介於 1－15 之間的數字後，將其
以二進位表示法輸出。
( 提示：輸出為４bits 之 unsigned 二進位數 )
Input : 9
Output:
![](https://i.imgur.com/aK0WZjB.png =50%x)

## 程式碼
基本的include和寫在主函式裡之後就不提了
(好像本來就不用提

**2-1**
```c=
int num;
```
宣告一個整數型態的變數叫做「num」，
負責記錄輸入的數字。
```c=2
printf("How much is it : ");
scanf("%d", &num);
```
按照題意敘述輸出並提示使用者輸入數字。
```c=4
printf("NT 100 : %d\n", num/100);
```
這裡%d在輸出時會變成逗號後面的「num/100」，
我們先假設這裡將num設為567，
這裡的num/100就會變成567/100 = 5。

為什麼會是5？
因為這裡num的資料型態是 **int** (integer)，
先前宣告的int num即代表num是一個可以存入「整數」性質的變數，
而整數與整數進行運算後仍會是整數，
因此567/100以數學運算來說會是5.67，
但在int型態的整數運算中會扣除小數點後部分，
所以最後輸出答案會變為5。
若以本題範例input：963為例，輸出答案就是9。
```c=5
printf("NT 50 : %d\n", num%100/50);
```
再來是50塊的部分，
num%100的意思是將num的數值除以100後得到的餘數，
以963%100為例，答案就是63，
接著再除以50就會得到商數為1(找一個50塊)。
```c=6
printf("NT 10 : %d\n", num%50/10);
```
這邊沒有%100的原因是%50過程就包含%100了，
963%50 = 13，
13/10 = 1。
```c=7
printf("NT 5 : %d\n", num%10/5);
```
同理，%10的過程即等於%50也等於%100，
963%10 = 3，
3/5 = 0。
```c=8
printf("NT 1 : %d", num%5);
```
若要寫的跟上面程式碼一樣的話還要加個/1，
但不加也沒差。
即完成題目2-1。

**2-2**
忘記這題當初在想什麼了==
因為題目限制數字1~15，
所以我直接硬算。
如果想要學如何將十進制換算成二進制，
千萬不要參考這個程式碼。

```c=
int num, ans, timer = 4;
printf("Please enter number : ");
scanf("%d", &num);
```
這裡的num會是一開始輸入的數字，
ans會是最後輸出的答案，
timer是用來記我在算第幾位數的，
在小於十進制16的數字中轉換為二進制時不會超過四位數，
所以我的timer一開始設為4。
```c
if (num%2==1 && timer == 4)
{
    ans += 1;
    num /= 2;
}
```
ans += 1的意思是 ans = ans + 1，
也就是將ans+1的值賦予給ans自己，
白話就是將ans加上1。
num /= 2的意思是 num = num / 2，
也就是將num/2的值賦予給num自己，
白話就是將num除以2。

當初學轉換二進制都是用短除法，
而這裡if判斷的就是num除以2的餘數是否等於1，
並且timer=4時，則將ans+1，再將num除以2。

借下面這張圖片說明(十進制的11轉二進制答案為1011)
![](https://i.imgur.com/NRVqa0R.png =20%x)
我們這一行判斷式做的事情就是11%2也就是第一個步驟，
若11%2\==1時(判斷式中的判定要用兩個等於「==」表示)，
如短除法所示，
我們給ans(待會輸出的答案)加上1，
這時的timer為4，代表著進行到第4位數。

接下來直接把整段程式碼貼出來比較好懂
```c=4
while (timer > 0)
{
    if (num%2==1 && timer == 4)
    {
        ans += 1;
        num /= 2;
    }
    else if (num%2==1 && timer == 3)
    {
        ans += 10;
        num /= 2;
    }
    else if (num%2==1 && timer == 2)
    {
        ans += 100;
        num /= 2;
    }
    else if (num%2==1 && timer == 1)
    {
        ans += 1000;
        num /= 2;
    }
    else
    {
        num /= 2;
    }
    timer -= 1;
}
```
那行if判斷式的邏輯套用在所有else if上就可以瞭解了，
else的部分則是因為餘數為0，
ans加上0直接省略。
每次執行完timer都會-1，
當timer=0的時候while迴圈便會停止並跳出。
```c=32
printf("Output : %04d", ans);
```
最後就是輸出答案，
%04d是%d的變形，
其中的4表示輸出4位數，
其中的0表示原先沒有數字的部分就補0上去。

2-2到此結束。


