牛客网 BC157 回文素数
题目描述
描述
现在给出一个素数,这个素数满足两点:
1、 只由1-9组成,并且每个数只出现一次,如13,23,1289。
2、 位数从高到低为递减或递增,如2459,87631。
请你判断一下,这个素数的回文数是否为素数(13的回文数是131,127的回文数是12721)。
输入描述:
输入只有1行。
第1行输入一个整数t,保证t为素数。
数据保证:9<t<109
输出描述:
输出一行字符串,如果t的回文数仍是素数,则输出“prime”,否则输出"noprime"。
思路分析
定义两个函数用来求回文数和判断素数
回文函数:
举个例子:
123的回文数是12321,可以看成,1232=123*10+((123/10)%10);
12321=1232*10+((12/10)%10);
而循环的次数是n的单位个数-1.
素数函数:
从2遍历到n的平方根,如果存在n%i==0就不是素数,反之则是。
步骤流程
1定义所输入数n(用long long定义),定义两个函数back(求回文数)和is_prime(判断素数)
back:
定义变量b存入n的值,并循环b求n的单位个数,每次循环,b=b/10,计数器a+1。
特殊情况:当a=1时,直接返回即可
以a>1为循环条件,用一个变量d保存n的值
每次循环:d=d*10+(n/10)%10
n=n/10
最后返回d。
is_prime:
从2遍历到n的平方根,如果有n%i==0存在就返回0(不是素数),循环完后最后返回1。
完整代码
#include <stdio.h>
#include<math.h>
long long back(long long n)
{
int a=0;
long long b=n;
while(b)
{
b=b/10;
a++;
}
long long d=n;
while(a>1) //a=1时直接返回d
{
d=d*10+((n/10)%10);
n/=10;
a--;
}
return d;
}
int is_prime(long long n)
{
for(int i=2;i<=sqrt(n);i++) //sqrt函数返回变量的平方根
{
if(n%i==0)
{
return 0;
}
}
return 1;
}
int main() {
long long n=0;
scanf("%lld",&n);
long long c=back(n);
int q=is_prime(c);
if(q==1)
{
printf("prime\n");
}
else {
printf("noprime\n");
}
return 0;
}