# 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;
}
```