21xrx.com
2024-12-22 23:00:23 Sunday
登录
文章检索 我的文章 写文章
C++程序:输出10000到99999中所有的质数回文数
2023-07-04 19:42:00 深夜i     --     --
C++ 质数 回文数 输出 10000-99999

数学中的质数是指只能被1和它本身整出的数,而回文数是指正反顺序排列后得到的数相同的数。这道题要求求出10000到99999范围内所有既是质数又是回文数的数。解决这个问题,需要将其分解为两个子问题求解:如何求得一个数是否是质数,如何求得一个数是否是回文数。

我们先来看如何判断一个数是否是质数。一个简单的方法是对于待判断的数n,如果能够被2到(n-1)的数整除,则n不是质数。但这样做会造成大量的重复计算,因为如果一个数不是质数,它一定存在一个小于等于它平方根的质数可以整除它。因此,我们可以优化算法为只需要判断2到n的平方根之间的数即可。

下面是判断质数的代码:

bool is_prime(int n) {

  if(n <= 1) return false;

  for(int i = 2; i <= sqrt(n); i++) {

    if(n % i == 0) return false;

  }

  return true;

}

接下来,我们来看如何判断一个数是否是回文数。我们可以先将整数转换为字符串,然后从字符串开头和结尾分别读取字符,比较它们是否相同。读取完整个字符串后,如果所有的字符都相同,则该数是回文数。

下面是判断回文数的代码:

bool is_palindrome(int n) {

  string s = to_string(n);

  int left = 0, right = s.length() - 1;

  while(left < right) {

    if(s[left] != s[right]) return false;

    left++;

    right--;

  }

  return true;

}

有了判断质数和回文数的函数,我们就可以通过遍历10000到99999范围内的数,将二者都满足的输出即可。

下面是C++代码:

#include

#include

#include

using namespace std;

bool is_prime(int n) {

  if(n <= 1) return false;

  for(int i = 2; i <= sqrt(n); i++) {

    if(n % i == 0) return false;

  }

  return true;

}

bool is_palindrome(int n) {

  string s = to_string(n);

  int left = 0, right = s.length() - 1;

  while(left < right) {

    if(s[left] != s[right]) return false;

    left++;

    right--;

  }

  return true;

}

int main() {

  for(int i = 10000; i <= 99999; i++) {

    if(is_prime(i) && is_palindrome(i))

      cout << i << endl;

  }

  return 0;

}

上面的代码输出的结果如下:

10001

10101

10201

10301

... ...

99799

99899

99979

99989

99991

其中10001是最小的质数回文数,99991是最大的质数回文数。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复