Description:
判断一个数是否为对称且不大于五位数的素数。Input:
输入数据含有不多于50个的正整数(0<n<2^32)。Output:
对于每个n,如果该数是不大于五位数的对称素数,则输出“Yes”,否则输出“No”。每个判断结果单独列一行。Sample Input:
11 101 272
Sample Output:
Yes
Yes
No
之前写过一个三位对称素数的算法,但测试后发现五位以内对称素数的判断有很多不同之处:
1.五位以内:范围是[0,99999],包括一位数;
注意,一位数的素数和11都是对称的。
2.四位数的对称数,不可能是素数。
假设四位对称数abba,即1000a+100b+10b+a=1001a+110b = 11(91a+10b),具有因子11,是合数。
其次,对memset函数的用法做出补充:
函数原型:void *memset(void *s, int ch, size_t n);
其中n是以字节byte为单位的
假设存在数组s[a]:
当s的类型为char时,n可以直接设置为整数a,因为字符类型占据内存的大小为1byte,与memset以字节为单位赋值一致;
当s的类型为int时,n不能直接设置为整数a,因为整型占据内存的大小为4byte,可以将n设置为a*sizeof(int),或者sizeof(s)。
代码:
#include <iostream>
#include <cmath>
#include <cstring>//函数memset用到
using namespace std;
int p[100005];
void IsPrime();
int main()
{
IsPrime();
int n;
while(cin>>n)
{
if (n>=100000) cout<<"No"<<endl;
else
{
if(p[n]==0)
{
if(n<12) cout<<"Yes\n";
else if(100<n<1000&&n/100==n%10) cout<<"Yes\n";
else if(n>10000&&(n/1000==n%10*10+n/10%10)) cout<<"Yes\n";
else cout<<"No\n";
}
else cout<<"No"<<endl;
}
}
return 0;
}
void IsPrime()
{
memset(p,0,sizeof(p)); //放在函数内部才能通过编译?!
p[0]=1;
p[1]=1;
for(int i=2;i<=sqrt(100000);i++)
{
if (p[i]==0)
{
for(int j=i*i; j<=100000;j+=i) p[j]=1;
}
}
}