---
# System prepended metadata

title: Bangla Numbers(UVA10101)
tags: [CPE一顆星必考題, CPE 一顆星]

---

# Bangla Numbers(UVA10101)
## [程式繳交區](https://hackmd.io/@Renektonn/rk_M3qcv1e/edit)
## 題目
[點我](https://onlinejudge.org/external/101/10101.pdf)

## 解題系統 
[UVA](https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=13&page=show_problem&problem=1042)
[ZJ](https://zerojudge.tw/ShowProblem?problemid=a741)

## 解題步驟

#### 1. 了解題意
將一個數轉為另一種表達方式
’kuti’ (10000000), ’lakh’ (100000), ’hajar’ (1000), ’shata’ (100) 
#### 2. 設計演算法
想法:
- 由大到小，取整再取餘。

問題:

- 轉換後如果可以轉，還要繼續轉，比如說45897458973958不能轉為

4589745 kuti 89 lakh 73 hajar 9 shata 58
而是
45 lakh 89 hajar 7 shata 45 kuti 89 lakh 73 hajar 9 shata 58

想法:
- 用recursion轉換


#### 3. 確定測資範圍
- a non-negative number ≤ 999999999999999.

所以用long long存，也有可能出現0

- 如果n = 10000001，那要輸出1 kuti 1，還是1 kuti 0 lakh 0 hajar 0 shata 1

是前者

## 演算法
```=
re(n): 輸入阿拉伯數字n，輸出(回傳值)n的Bangla number
1. k = n / 10000000，代表kuti的數量，若k大於0，呼叫re(k)，再輸出kuti
2. d = n % 10000000，利用智慧找零系統的方式，算出d的Bangla number
```
:::warning
要約定好空格是由誰負責輸出！
:::
```
1. 宣告cas = 1
2. 輸入n(long long int)，如果沒東西，則結束
3. 輸出cas，固定4格寬，若n為0，輸出" 0\n"，否則，呼叫re(n)，輸出"\n"
4. cas++
```

## 程式碼
```cpp=
#include <bits/stdc++.h>
#define int long long int
using namespace std;

void re (int n) {
    int k = n / 10000000;
    if (k > 0) {
        re(n / 10000000);
        cout << " kuti";
    }
    int d = n % 10000000;
    if (d >= 100000) {
        cout << " " << d / 100000 << " lakh";
        d %= 100000;
    }
    if (d >= 1000) {
        cout << " " << d / 1000 << " hajar";
        d %= 1000;
    }
    if (d >= 100) {
        cout << " " << d / 100 << " shata";
        d %= 100;
    }
    if (d > 0) {
        cout << " " << d;
    }
}

signed main(){	
    int n;
    int cas = 1;
    while (cin >> n) {
        printf("%4lld.", cas);
        if (n == 0) {
            cout << " 0" << endl;
        } else {
            re(n);
            cout << endl;
        }
        cas++;
    }
    return 0;
}
```
:::warning
re(n)會固定在開頭輸出一個空白字元
:::


