全wa,求助大佬

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

chenshihao20110204 @ 2023-08-18 10:22:21

这是我的源代码

include<bits/stdc++.h>
using namespace std;1. 
bool sushu(int a);//自创函数,判断是否为素数
int weishu(int a);//判断位数
int main()
{
    int a,b;//起始值和结束值
    cin>>a>>b;
    for(int i=a;i<=b;i++)
    {
        if(i==8)
        {
            cout<<11<<endl;//特判输出11,因为偶数位的数只有11是回文素数
        }
        if(i==9999999)//题目范围最大到一亿,所以算到7位数就行了
        {
            break;
        }
        if(weishu(i)%2==0)//如果是偶数位,那么值乘以10,因为偶数位只有一个回文素数11
        {
            i*=10;
        }
        switch(weishu(i))//判断是否为回文素数
        {
        case 1:
            {
                if(sushu(i))//一位数只用判断是否为素数即可
                {
                    cout<<i<<"\n";
                }
                break;
            }
        case 3://三位数判断百位和个位是否相等,并且判断是否为素数
            {
                if(i/100==i%10&&sushu(i))
                {
                    cout<<i<<"\n";
                }
                break;
            }   
        case 5://五位数判断万位与个位是否相等,并判断千位与十位是否相等,最后判断是否为素数
            {
                if(i/10000==i%10&&i/1000%10==i%100/10&&sushu(i))
                {
                    cout<<i;
                }
                break;
            }
        case 7://七位数要判断百万位和个位,十万位和十位,万位和百位,以及是否为素数
            {
                if(i/1000000==i%10&&i/100000%10==i/100%10&&i/10000%10==i%1000/100&&sushu(i))
                {
                    cout<<i<<endl;
                }
                break;
            }
            }
    }
}
bool sushu(int a)
{
    for(int i=2;i*i<=a;i++)
    {
        if(a%i==0)
        {
            return false;
        }
    }
    return true;
}//自创函数,判断是否为素数
int weishu(int a)
{
    int sum=0;
    while(a>10)
    {
        a/=10;
        sum++;
    }
    return sum;
}//自创函数,判断位数

有大佬的话,帮一帮吧


by Cryflmind @ 2023-08-18 10:26:45

???没这么麻烦啊


by dthythxth_Huge_Brain @ 2023-08-18 10:31:25

打表了解一下


by Cryflmind @ 2023-08-18 10:31:40

#include <bits/stdc++.h>
using namespace std;
int x, y;
int check(int k){
    int a[10],i=0,j;
    while (k>0){
        a[i]=k%10;
        k/=10;
        i++;
    } //a存储数字的每一位
    for (j=0; j<i; j++)
        if (a[j]!=a[i-j-1])
            return 0;
    return 1; //如果第j项和对应的项不相同,返回0,否则返回1
}
int length(int k){ //返回数字的长度
    int a[10],i=0;
    while (k>0){
        a[i]=k%10;
        k/=10;
        i++;
    }
    return (i);
}
int prime(int k){ //判断是否是质数
    int i;
    for (i=3; i*i<=k; i+=2)
        if (k%i==0)
            return 0;
    return 1;
}
int extend(int k){
    int i,s=1;
    for (i=0; i<k; i++)
        s*=10;
    return (s);
}
void pre(){
    scanf("%d %d", &x, &y);
}
void work(){
    for (register int i=x; i<=y; i++){
        if((i%2==0&&i!=2)||(i%5==0&&i!=5))continue;
        if (length(i)%2==0&&i!=11){
            i=extend(length(i));
            continue;
        }
        if (!check(i))
            continue;
        if (prime(i))
            printf("%d\n",i);
    }
}
int main(){
    pre();
    work();
    return 0;
}

你要不读读?


by _Clown__ @ 2023-08-18 10:33:25

@chenshihao20110204 您可以写一个生成回文数的函数,枚举,同时判断是否为素数和回文数,输出即可


by _Clown__ @ 2023-08-18 10:35:10

@chenshihao20110204 参考:

int hw(int x){
    int sum=0,k=x;
    while(x!=0){
        sum=sum*10+x%10;
        x/=10;
    }
    if(sum==k) return 1;
    return 0;
}
int main(){
    int n,b;
    scanf("%d%d",&n,&b);
    for(int i=n;i<=b;i++){
        if(i==9989900) break;
        if(hw(i)&&p(i)) cout<<i<<endl;
    }
    return 0;
}

by gaoshengxi @ 2023-08-18 10:52:28

我啥也不干,就吃个瓜。


|