[PAT解题报告] Reversible Primes
给定自然数n,不超过105,再给定d, 问n是否是质数,并且把n化成d进制后,把数字倒过来(123变成321)还是不是质数。
注意1不是质数。
分析: 不难。主要有两个考点:
(1) 把n化成d进制,再翻转数字。 这个我们不断地除以d就好了,而且先得到的是低位数字,我们直接用x = x * d + n %
d,最终x就是翻转后的结果了,很方便, O(logn)
(2)
判断x是否是质数,一个数的最小的约数不超过sqrt(x),所以循环没有必要到x,但从本题的数据范围似乎循环到x也没大问题,不过还是推荐sqrt(x)吧,
O(sqrt(x)) = O(x0.5)
代码:
#include <cstdio> #include <cstring> #include <string> using namespace std; bool prime(int x) { if (x <= 1) { return false; } for (int i = 2; x / i >= i; ++i) { if (x % i == 0) { return false; } } return true; } int main() { for (;;) { int n; scanf("%d",&n); if (n < 0) { break; } int d; scanf("%d",&d); if (prime(n)) {; int x = 0; for (; n; n /= d) { x = x * d + n % d; } puts(prime(x)?"Yes":"No"); } else { puts("No"); } } return 0; }
原题链接: http://www.patest.cn/contests/pat-a-practise/1015