挑错

P1217 [USACO1.5] 回文质数 Prime Palindromes

laopig @ 2023-01-03 19:58:51

代码:

#include<bits/stdc++.h>
using namespace std;
int cnt;
bool prim(int n)
{
    for(int i=2;i*i<=n;i++)
        if(n%i==0)
            return 1;
    return 0;
}
bool hws(int n)
{
    int a[10],b[10];
    for(int i=1;i<=9;i++)
    {
        a[i]=n%10;
        n/=10;
        if(n==9)
            break;
        cnt++;
    }
    for(int i=1;i<=cnt;i++)
        b[i]=a[i];
    reverse(a,a+cnt+1);
    for(int i=1;i<=cnt;i++)
        if(b[i]!=a[i])
            return 1;
    return 0;
}
int main()
{
    int a,b;
    cin>>a>>b;
    for(int i=a;i<=b;i++)
    {
        if(i%2==0)
            continue;
        if(prim(i)==0&&hws(i)==0)
            cout<<i<<"\n";
    }
    return 0;
}

by wanggk @ 2023-01-03 22:20:06

@laopig

目前是改成这样。但是这样会超时。 另外的改进方法:1. 可以把判断回文简化,去掉reverse和b数组,改成 if(a[i]!=a[cnt+1-i]) 类似的,但这样之后我试了用处不大。2. 把单个判断质数改成质数筛,优化比较大。

目前的问题在注释里打上了。

#include<bits/stdc++.h>
using namespace std;
int cnt;
bool prim(int n)
{
    for(int i=2;i*i<=n;i++) if(n%i==0) return 1;
    return 0;
}
bool hws(int n)
{
    int a[10],b[10];
    cnt=0;//每一次判断前都要将cnt设为0(否则cnt越来越大数组要爆掉)
    for(int i=1;i<=9;i++)
    {
        a[i]=n%10;
        n/=10;
        cnt++;//这句话要放在这里(否则n==0 break了那么最后一次就算不进去了,可以找个数据手算一下cnt)
        if(n==0)//if(n==9)当n被除到0时意味着每一位都被分完了
            break;
//        cnt++;
    }
    for(int i=1;i<=cnt;i++)
        b[i]=a[i];
    reverse(a+1,a+cnt+1);//reverse(a,a+cnt+1); 要从1开始翻转
    for(int i=1;i<=cnt;i++)
        if(b[i]!=a[i])
            return 1;
    return 0;
}
int main()
{
    int a,b;
    cin>>a>>b;
    for(int i=a;i<=b;i++)
    {
//        if(i%2==0) continue;
//上面这句没有必要写(理由:2在prime函数和hws函数中都能正确判断),写了还会错(理由:2为反例)
        if(prim(i)==0&&hws(i)==0)
            cout<<i<<"\n";
    }
    return 0;
}

by wanggk @ 2023-01-03 22:21:30

@laopig 另外看到我之前的代码,有一段:

cin>>l>>r;
if(r>10000000) r=10000000;

by laopig @ 2023-01-10 20:20:10

@wanggk 栓Q~


|