依旧采用之前构造素数的办法https://blog.csdn.net/Rachelhello123/article/details/119747427
适当修改,适合题目
尽管构造的思路还是和之前一样,但是这次发现了很多bug
1.将输出的具体数字改为个数,其实还是很方便了,只要一直搞个变量在那里++就行。
2.之前没有考虑到b<10的情况,默认b是一个很大的值,其实是不合理的,题目并未具体说明
3.然后就是如果a是个两位数,把a2=10的情况这样可以加上101这种情况
4.最后改动的部分,是加上了很多continue,这样可以很好的把测试素数的值控制在a-b之间
#include <cstdio>
#include <iostream>
using namespace std;
long long a,b,c,d,num[11],cnt,cntt;
bool isaprime(int a)
{
if(a==0||a==1) return 0;
if(a==2) return 1;
for(int i=2;i*i<=a;i++)
{
if(a%i==0) return 0;
}
return 1;
}
int main()
{
cin>>a>>b;
cntt=0;
long long a1=a,a2=a,cnta=1;
if(a<=11)
{
if(b<=11)
{
for(int j=a;j<=b;j++)
{
if(isaprime(j)!=0) {cntt++;}
}
}
else
{
for(int j=a;j<=11;j++)
{
if(isaprime(j)!=0) {cntt++;}
}
}
}
while(a1>=10)
{
cnta++;
a1/=10;
}
//cout<<"cnta="<<cnta<<endl;
if(a2>=10&&a2<100) a2=10;
if(a2>100)
{
for(int i=1;i<=cnta/2;i++) a2/=10;
}
//cout<<"a2="<<a2<<endl;
for(int i=a2;i<=b;i++)
{
c=i;
cnt=1;
while(c>=10)
{
num[cnt]=c%10;
cnt++;
c/=10;
}
num[cnt]=c%10;
if(cnt>1)
{
d=i;
for(int j=2;j<=cnt;j++)
{
d=d*10+num[j];
}
if(d<a) continue;
if(d>b) break;
if(isaprime(d)!=0) cntt++;
d=i;
for(int j=1;j<=cnt;j++)
{
d=d*10+num[j];
}
if(d<a) continue;
if(d>b) continue;
if(isaprime(d)!=0) cntt++;
}
}
cout<<cntt<<endl;
return 0;
}