注:1是非素数
#include <stdio.h>
#include <cmath>
int getNumWithRadix(int n, int d);
int getDecimal(int n, int d);
int getReverse(int n);
bool isPrime(int n);
int main(int argc, char *argv[]) {
int n, d;
int nr;
bool ans;
scanf("%d", &n);
while(n > 0) {
scanf("%d", &d);
if (!isPrime(n)) {
printf("No\n");
}
else {
nr = getNumWithRadix(n, d);
nr = getReverse(nr);
nr = getDecimal(nr, d);
if (isPrime(nr)) {
printf("Yes\n");
} else
printf("No\n");
}
scanf("%d", &n);
}
return 0;
}
bool isPrime(int n) {
if (n == 1)
return false;
int i;
for (i = 2; i <= int(sqrt(n)); i++) {
if (n % i == 0) //对0取模错
return false;
}
return true;
}
int getNumWithRadix(int n, int d) {
int rt = 0;
int i = 0;
while(n > 0) {
rt = rt + n % d * pow(10, i);
n = n / d;
i++;
}
return rt;
}
int getDecimal(int n, int d) {
int rt = 0;
int i = 0;
while (n > 0) {
rt = rt + n % 10 * int(pow(d, i));
n = n / 10;
i++;
}
return rt;
}
int getReverse(int n) {
int rt = 0;
while (n > 0) {
rt = rt * 10 + n % 10;
n = n / 10;
}
return rt;
}
另一种方法是使用数组:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
bool isPrime(int n) {
if (n == 1) return false;
if (n == 2) return true;//可删
for (int i = 2; i * i <= n; i++) {
if (n % i == 0)
return false;
}
return true;
}
int getReversed (int n, int radix) {
int i = 0;
int strNum[17];
memset(strNum, 0, 17 * sizeof(int));
int k = 0;
while (n > 0) {
strNum[k] = n % radix;
n = n / radix;
k++;
}
int ret = 0;
for (i = 0; i < k; i++) {
ret += (strNum[i]) * pow(radix, k - i - 1);
}
return ret;
}
int main() {
int x, radix;
cin >> x;
while (x >= 0) {
cin >> radix;
if (isPrime(x)) {
int y = getReversed(x, radix);
if (isPrime(y)) {
cout << "Yes" << endl;
} else
cout << "No" << endl;
} else
cout << "No" << endl;
cin >> x;
}
return 0;
}