dreamlike @ 2023-02-11 03:35:48
个人思路就是先检验是否为回文数,再检验是否为质数。回文数是用倒置来验证,数目大是建议用字符串,但这道题是整数递增来一个个验证的,数据类型匹配不了,我脑子实在没能转过来害;质数的话已经是平方减半了,不知道还能不能优化。 目前最后一个超时是1.02s,测试数据是5 100000000,卑微请各位大佬赐教! 代码如下:
#include<stdio.h>
int prime(int x){
int i;
for(i=2;i*i<=x;i++)
if(x%i==0) return 0;
return x<=1?0:1;
}
int isHuiwenNumber(int n)
{
int sum,tmp;
tmp=n;
sum=0;
while(n) //从低位到高位分解n的每位的数字,然后依次相加
{
sum=sum*10+n%10;
n/=10;
}
if(tmp == sum) //如果重新每位求和的值等于原值,则该数为完数,返回1,否则返回0
return 1;
else
return 0;
}
int main(){
int a,b,i;
scanf("%d %d",&a,&b);
for(i=a;i<=b;i++)
{
if(isHuiwenNumber(i))
{
if(prime(i))
printf("%d\n",i);
}
}
}
by Usada_Pekora @ 2023-02-11 03:48:46
@dreamlike 枚举ab中所有的奇数。
by Usada_Pekora @ 2023-02-11 03:49:52
#include<stdio.h>
int prime(int x){
int i;
for(i=2;i*i<=x;i++)
if(x%i==0) return 0;
return x<=1?0:1;
}
int isHuiwenNumber(int n)
{
int sum,tmp;
tmp=n;
sum=0;
while(n) //从低位到高位分解n的每位的数字,然后依次相加
{
sum=sum*10+n%10;
n/=10;
}
if(tmp == sum) //如果重新每位求和的值等于原值,则该数为完数,返回1,否则返回0
return 1;
else
return 0;
}
int main(){
int a,b,i;
scanf("%d %d",&a,&b);
if(a%2==0)a++;
for(i=a;i<=b;i+=2)
{
if(isHuiwenNumber(i))
{
if(prime(i))
printf("%d\n",i);
}
}
}
by dreamlike @ 2023-02-11 03:58:56
@Usada_Pekora 试了下,减半后但还是超时,应该还是出在检验质数还是回文数的操作上害
by Usada_Pekora @ 2023-02-11 05:33:32
@dreamlike https://www.luogu.com.cn/record/101875174
写暴力不开 O2?
by Nwayy @ 2023-02-11 07:08:39
@dreamlike 显然这道题没有必要从
by 大眼仔Happy @ 2023-02-11 07:16:10
有没有可能先找出所有的回文数,再判断
by dreamlike @ 2023-02-11 14:18:37
@Usada_Pekora 哦吼!没玩明白O2优化,谢谢!
by dreamlike @ 2023-02-11 14:21:43
@winds888 你好,其他的懂了,方便问问“如果 b≥10^8 可以直接缩小为10^7”的原因么
by Nwayy @ 2023-02-11 14:52:52
@dreamlike 说错了,后面那句话不用管
by dreamlike @ 2023-02-11 16:08:40
@winds888 好滴谢谢!