---
# System prepended metadata

title: Simply Emirp(UVA10235)
tags: [CPE一顆星必考題]

---

# Simply Emirp(UVA10235)
## [程式繳交區](https://hackmd.io/@Renektonn/ByxsVyadye/edit)
## 題目
[點我](https://onlinejudge.org/external/102/10235.pdf)

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

## 演算法1
```
1. 輸入n，若無法，則停止
2. 將n倒轉過來變成u，，判斷以下三種可能，輸出對應的結果

"N is not prime."，如果 N 不是一個質數
"n is prime."，如果 n 是一個質數，但是不是一個 Emirp
"n is emirp."，如果 n 是一個 emirp(u跟n不同，且u是質數)
```

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

int isPrime (int n) {
    int cnt = 0;
    for (int i = 1; i <= n; i++) {
        if (n % i == 0) cnt++;
    }
    return cnt == 2;
}

signed main() {
    int n;
    while (cin >> n) {
        string str = to_string(n);
        reverse(begin(str), end(str));
        int u = stoi(str);
        if (!isPrime(n)) {
            cout << n << " is not prime." << endl;
        } else if (u == n or !isPrime(u)) {
            cout << n << " is prime." << endl;
        } else {
            cout << n << " is emirp." << endl;
        }
    }
    return 0;
}
```
:::info
演算法太慢，要用篩法建質數表
:::

## 演算法2
```
1. 用篩法建質數表
2. 輸入n，若無法，則停止
3. 將n倒轉過來變成u，利用質數表判斷以下三種可能，輸出對應的結果

"N is not prime."，如果 N 不是一個質數
"n is prime."，如果 n 是一個質數，但是不是一個 Emirp
"n is emirp."，如果 n 是一個 emirp(u跟n不同，且u是質數)
```

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

signed main() {
    bitset <1000001> isPrime;
    isPrime.set();
    for (int i = 2; i <= 1001; i++) {
        if (isPrime[i]) {
            for (int j = 2 * i; j <= 1000000; j += i) {
                isPrime[j] = 0;
            }
        }
    }
    int n;
    while (cin >> n) {
        string str = to_string(n);
        reverse(begin(str), end(str));
        int u = stoi(str);
        if (!isPrime[n]) {
            cout << n << " is not prime." << endl;
        } else if (u == n or !isPrime[u]) {
            cout << n << " is prime." << endl;
        } else {
            cout << n << " is emirp." << endl;
        }
    }
    return 0;
}
```