感觉这道题是不是和顺序有关 我第一次用的这个代码。
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
using namespace std;
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
bool isprime(int a) {
for (int i = 3; i < sqrt(a) + 1; ++i) {
if ((a % i) == 0) {
return false;
}
}
return true;
}
int getlenth(int i) {
int ret = 0;
for (; i > 0; i /= 10) {
ret++;
}
return ret;
}
int main() {
int max, min;
cin >> min >> max;
int lenthmax = getlenth(max);
int lenthmin = getlenth(min);
int numnow;
for (int i = lenthmin; i <= lenthmax; ++i) { // i是当前分析的位数
for (int j = 1; j < pow(10, (i + 1) / 2); j += 2) { // j是num的生成数
numnow = 0;
{
int j0 = j;
for (int k = 0; k <= i - k - 1; k++) {
if (k == i - k - 1) {
numnow += pow(10, k) * (j0 % 10);
} else {
numnow += (pow(10, k) + pow(10, i - k - 1)) * (j0 % 10);
}
j0 /= 10;
} //生成numnow
}
if (isprime(numnow) && min <= numnow && numnow <= max) {
printf("%d\n", numnow);
}
}
}
return 0;
}
我想了很久把生成回文数的方法改掉了,因为用这种方法生成的回文数会先修改个位/十位后修改百位。
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
using namespace std;
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
bool isprime(int a) {
for (int i = 2; i < sqrt(a) + 1; ++i) {
if ((a % i) == 0) {
return false;
}
}
return true;
}
int getlenth(int i) {
int ret = 0;
for (; i > 0; i /= 10) {
ret++;
}
return ret;
}
int main() {
int max, min;
cin >> min >> max;
int lenthmax = getlenth(max);
int lenthmin = getlenth(min);
int numnow;
for (int i = lenthmin; i <= lenthmax; ++i) { // i是当前分析的位数
for (int j = 1; j < pow(10, (i + 1) / 2); ++j) { // j是num的生成数
numnow = 0;
{
int j0 = j;
for (int k = (i - 1) / 2; k >= 0; k--) {
if (k == i - k - 1) {
numnow += pow(10, k) * (j0 % 10);
} else {
numnow += (pow(10, k) + pow(10, i - k - 1)) * (j0 % 10);
}
j0 /= 10;
} //生成numnow
}
if ((isprime(numnow) && min <= numnow && numnow <= max)) {
printf("%d\n", numnow);
}
}
}
return 0;
}
然后过了,我用前一种方法,拿最大的范围生成的数据去excel里面试了试对比了题解里面的答案(排序然后对比),没发现有差异的样子啊。