这道题的答案和顺序有关吗?
查看原帖
这道题的答案和顺序有关吗?
464108
Cosing楼主2022/1/24 11:20

感觉这道题是不是和顺序有关 我第一次用的这个代码。

#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里面试了试对比了题解里面的答案(排序然后对比),没发现有差异的样子啊。

2022/1/24 11:20
加载中...