问题描述】所谓“绝对素数”是指具有如下性质的素数:一个素数,当它的各位数字逆序排列,形成的整数仍为素数,这样的数称为绝对素数。例如:11,79,389是素数,其各位数字对换位置后分别为11,97,983仍为素数,因此这三个素数均为绝对素数。编写函数int absolute(int x),判断一个整数是否为绝对素数,如果x是绝对素数则返回1,否则返回0。编写程序接收控制台输入的两个整数a,b。调用absolute函数输出所有a到b之间(包括a和b)的绝对素数
【输入形式】控制台输入两个整数a和b,以空格分隔。
【输出形式】输出有若干行,每行有一个a和b之间的绝对整数。输出各行上的数字不重复,且从小至大依次按序输出。
【样例输入】80 120
【样例输出】
97
101
107
113
【样例说明】输入整数a=80,b=120,要求输出所有[80, 120]之间的绝对素数。有97,101,107和113,按升序分行输出。
【评分标准】该题要求输出若干行整数。如果你的程序计算的结果正确,则该测试点得满分,否则该测试点得0分。
写一个函数将整数逆序就行了啊
#include <stdio.h>
int isprime(int n)
{
if(n==1)
return 0;
for(int i=2;i*i<=n;i++)
if(n%i==0)
return 0;
return 1;
}
int rev(int n)
{
int m = 0;
while(n>0)
{
m = m*10+n%10;
n=n/10;
}
return m;
}
int absolute(int n)
{
if(isprime(n) == 0)
return 0;
int m = rev(n);
return isprime(m);
}
int main()
{
int m,n,i;
scanf("%d%d",&m,&n);
for(int i=m;i<=n;i++)
{
if(absolute(i) == 1)
printf("%d\n",i);
}
return 0;
}
该回答引用ChatGPT
首先定义了两个函数isPrime和isAbsolutePrime,分别用于判断一个数是否为素数和绝对素数。其中isPrime函数遍历2到$\sqrt{x}$之间的数,如果能被整除,则不是素数。isAbsolutePrime函数则是先判断$x$是否为素数,再将$x$的各位数字逆序排列,判断逆序后的数是否为素数。
在main函数中,先输入$a$和$b$,然后遍历[a, b]之间的数,调用isAbsolutePrime函数判断是否为绝对素数,如果是,则输出该数。
#include <iostream>
#include <cmath>
using namespace std;
// 判断一个数是否为素数
bool isPrime(int x)
{
if (x <= 1)
return false;
int sqr = sqrt(x);
for (int i = 2; i <= sqr; i++) {
if (x % i == 0)
return false;
}
return true;
}
// 判断一个数是否为绝对素数
bool isAbsolutePrime(int x)
{
// 先判断x是否为素数
if (!isPrime(x))
return false;
// 将x的各位数字逆序排列
int reverseNum = 0;
while (x > 0) {
reverseNum = reverseNum * 10 + x % 10;
x /= 10;
}
// 判断逆序后的数是否为素数
return isPrime(reverseNum);
}
int main()
{
int a, b;
cin >> a >> b;
// 遍历[a, b]之间的数,判断是否为绝对素数
for (int i = a; i <= b; i++) {
if (isAbsolutePrime(i)) {
cout << i << endl;
}
}
return 0;
}
1.筛选法求原素数
2.整数拆分+重组调换顺序(stringstream 也可以 当字符串转换)
3.用筛选结果再求一遍
4.完成
p.s.千万不要用普通单个求素数方法