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~