1. 程式人生 > >1015 Reversible Primes (20 分)C++實現 (已AC)

1015 Reversible Primes (20 分)C++實現 (已AC)

題目

題目連結:https://pintia.cn/problem-sets/994805342720868352/problems/994805495863296000

思路:

這道題的思路很簡單, 檢查輸入數是否是質數, 如果是的話, 把它按進位制轉換, 再翻轉, 轉換回10, 判斷是否為質數.

坑點:

  1. 別忘了1不是質數
  2. 檢查輸入的N是否是質數
  3. 本題中不涉及的可能存在的坑, 如果D是一個大於10的數, 不能需要將每一位單獨儲存, 然後翻轉, 轉制回10

程式碼

#include<iostream>
#include<string>
#include<cmath> #include<vector> using namespace std; vector<int> reverse_trans(int dec, int base_to); bool verify_prime(int); void solution(); void Test_verify_prime(); void Test_reverse_trans(); int vec_to_10(vector<int>, int); int main() { //Test_verify_prime(); //Test_reverse_trans();
solution(); getchar(); getchar(); return 0; } string reverse_trans1(int dec, int base_to) { string s; if (dec == 0) { return "0"; }; int exp = log(dec) / log(base_to); // find the max log(N)/ log(base) int base = pow(base_to, exp); while (base) { int
digit = dec / base; dec -= digit * base; base /= base_to; s = to_string(digit) + s; } return s; } bool verify_prime(int item) { if (item <2) return false; if (item == 2) return true; for (int i = 2; i <= sqrt(item); i++) { if (item % i == 0) return false; } return true; } void solution() { int N, D; while (1) { cin >> N; if (N < 0) break; cin >> D; if (!verify_prime(N)) { cout << "No\n"; continue; } // vector<int> s_trans = reverse_trans(N, D); // trans a N to the number based on D and reverse it. // int reverse_int = vec_to_10(s_trans, D); string s_trans = reverse_trans1(N, D); int reverse_int = stoi(s_trans, nullptr, D); if (verify_prime(reverse_int)) cout << "Yes\n"; else cout << "No\n"; } } void Test_verify_prime() { cout << "test verify_prime: " << endl; int test[15] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 15, 27}; for(int i = 0; i < 15; i++) { cout << verify_prime(test[i]) << " "; } cout << "\nN N Y Y N Y N Y N N Y N Y N N" << endl; } void Test_reverse_trans() { cout << "test reverse_trans: " << endl; } vector<int> reverse_trans(int dec, int base_to) // abandon. Not efficient. { vector<int> s; if (dec == 0) { s.push_back(0); return s; }; int base = 1; while (dec / base) base *= base_to; base = base / base_to; while (base) { int digit = dec / base; dec -= digit * base; base /= base_to; s.push_back(digit); } return s; } int vec_to_10(vector<int> s, int base) { int sum = 0; for(auto f = s.rbegin(); f != s.rend(); f++) { sum = sum * base + *f; } return sum; }