루오 구 P1217 회문 소수
링크
https://www.luogu.org/problem/P1217
이름
제목 설명
151는 모두 소수 회문이다 (왼쪽 오른쪽 왼쪽에서 오른쪽으로 동일하다) 때문에 그렇게 151 회문 소수이다.
범위를 찾을 수있는 프로그램을 작성 [A, B] (5 <A <B <100,000,000) 모든 회문 기질 (일억).
입력 형식
1 호선 : 두 정수 a와 b.
출력 형식
출력 회문 소수, 한 줄에 하나의 목록입니다.
샘플 입출력
입력 # 1
5 500
출력 # 1
5
7
11
101
131
151
181
191
313
353
373
383
설명 / 팁
힌트 1 : 회문을 생성하고 소수 있는지.
팁 1 : 모든 회문을 찾아 그들이 (프라임) 질 수없는 경우 다음 결정합니다.
힌트 2 : 제대로 자리를 결합하여 회문를 생성합니다. 아래처럼 루프 중 하나 이상이 필요할 수 있습니다.
팁 2 : 당신은 다음과 같은 몇 가지 사이클을해야 할 수도 있습니다, 올바른 회문을 생산합니다.
NOCOW에서 제목 번역.
USACO 교육 1.5 절
회문 길이 5를 생성 :
for (d1 = 1; d1 <= 9; d1+=2) { // 只有奇数才会是素数
for (d2 = 0; d2 <= 9; d2++) {
for (d3 = 0; d3 <= 9; d3++) {
palindrome = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)
}
}
}
생각
설명은 직접 줄에 인코딩 보지 마십시오. 나는 LeetCode에 같은 제목,하지만 조금 더의 성능 요구 사항을했다. 요구 사항이, 소수, 회문으로 나눌 수 있습니다.
모든 심지어 비트 회문은, (11)에 의해 나눌 수 있습니다, 그것은, 그래서 판사가, 내가 원본을 사용할 수 있습니다 직접 후, 짝수, 소수 아닌 수 많은 무엇을 선별 할 수 있고 부분을 선별 할 수 있음을 증명했다 문자 처리는, 저 같은 비트의 발견 후, 배열을 교체하고 시작을 결정하고, 난 그냥 판사가 그 조건을 넣어 밀어을 할 회문 아무것도 회문하지 효율성 비율이 약간 높은 소수를 배치해야합니다.
코드
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
//质数
bool isPrime(int i)
{
for (int j = 2; j <= sqrt(i); j++)
if (i % j == 0)
return false;
return true;
}
//回文
bool isHui(int s)
{
if((s>=1000 && s<10000)|| (s>=100000 && s<1000000) || (s>=10000000 && s<100000000))
return false;
int a[10],i=0;
while(s>0)
{
a[i]=s%10;
s=s/10;
i++;
}
for(int j=0;j<i/2+1;j++)
{
if(a[j]!=a[i-j-1])
return false;
}
return true;
}
int main()
{
int a,b;
cin>>a>>b;
for(int i=a;i<=b;i++)
{
if(i%2==0)
continue;
if(isHui(i) &&isPrime(i))
cout<<i<<endl;
}
return 0;
}