洛谷 P1217 [USACO1.5]回文质数 Prime Palindromes.
找回文数
问题描述:
回文数不好构造,但可以利用函数进行判断该数是否为回文数
错误示范:
for (d1 = 1; d1 <= 9; d1+=2) { // 只有奇数才会是素数
for (d2 = 0; d2 <= 9; d2++) {
for (d3 = 0; d3 <= 9; d3++) {
palindrome = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)
}
}
}
for(int i=1;i<=9;i++)
{
for(int ii=0;ii<=9;ii++)
{
num=100*i+10*ii+i;
if(isprime[num]&&num>=l&&num<=r)
cout<<num<<endl;
}
}
for(int i=1;i<=9;i++)
{
for(int ii=0;ii<=9;ii++)
{
for(int iii=0;iii<=9;iii++)
{
num=10000*i+1000*ii+100*iii+10*ii+i;
if(isprime[num]&&num>=l&&num<=r)
cout<<num<<endl;
}
}
}
for(int i=1;i<=9;i++)
{
for(int ii=0;ii<=9;ii++)
{
for(int iii=0;iii<=9;iii++)
{
for(int iiii=0;iiii<=9;iiii++)
{
num=1000000*i+100000*ii+10000*iii+1000*iiii+100*iii+10*ii+i;
if(isprime[num]&&num>=l&&num<=r)
cout<<num<<endl;
}
}
}
}
从3位一直判断到7位,显然这不是最方便的解法
正确示范
bool isHWS(int num) {
int temp=num,ans=0;
while (temp!=0) {
ans=ans*10+temp%10;
temp/=10;
}
if (ans==num)
return true;
else
return false;
}
if (isprime[i] && isHWS(i))
cout<<i<<endl;//如果既是质数同时也是回文数,就输出。
在不追求时间的情况下,可以用枚举加判断的方法找出回文数
找质数
这里我们选择用欧拉筛(也就是线性筛)的方法求质数
参考 P3383 【模板】线性筛素数.的题解链接: 欧拉筛筛素数
.
写的太好了,总结的非常到位,非常值得学习。
const int MAX_N = 100000009;
int top=0;
int prime[MAX_N];
bool isprime[MAX_N];
void get_prime(int n)
{
memset(isprime,true,sizeof(isprime));
for(int i=2;i<=n;i++)
{
if(isprime[i])
{
prime[++top]=i;
}
for(int j=1;j<=top&&i*prime[j]<=n;j++)
{
isprime[i*prime[j]]=false;
if(i%prime[j]==0)
{
break;
}
}
}
}
上面的可以说是线性筛的模板了