P1217 [USACO1.5]回文质数 Prime Palindromes
题目描述
因为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
说明
Hint 1: Generate the palindromes and see if they are prime.
提示 1: 找出所有的回文数再判断它们是不是质数(素数).
Hint 2: Generate palindromes by combining digits properly. You might need more than one of the loops like below.
提示 2: 要产生正确的回文数,你可能需要几个像下面这样的循环。
题目翻译来自NOCOW。
USACO Training Section 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;//(处理回文数...)
}
}
}
超时代码
#include <bits/stdc++.h>
using namespace std;
int fun1(int a)
{
if(a<=1)
return 0;
for(int i=2;i<=sqrt(a);i++)
{
if(a%i==0)
return 0;
}
return 1;
}
int main()
{
int a[100000],l=0;//用一个数组把所有符合条件的数存起来;超时
for(int i=2;i<=9;i++)
{
if(fun1(i))
{
a[l]=i;
l++;
}
}
//if(a==11)//除11外,偶数位回文数肯定不为素数
a[l]=11;
l++;
//if(a>=100&&a<=999)//三位数
//{
for (int d1 = 1; d1 <= 9; d1+=2)
{ // 只有奇数才会是素数
for (int d2 = 0; d2 <= 9; d2++)
{
int f=100*d1 + 10*d2 + d1;//(处理回文数...)
if(fun1(f))
{
a[l]=f;
l++;
}
}
}
//}
//if(a<=99999&&a>=10000)//五位数
//{
for (int d1 = 1; d1 <= 9; d1+=2)
{ // 只有奇数才会是素数
for (int d2 = 0; d2 <= 9; d2++)
{
for (int d3 = 0; d3 <= 9; d3++)
{
int f=10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)
if(fun1(f))
{
a[l]=f;
l++;
}
}
}
}
//}
//if(a<=9999999&&a>=1000000)//七位数
//{
for (int d1 = 1; d1 <= 9; d1+=2)
{ // 只有奇数才会是素数
for (int d2 = 0; d2 <= 9; d2++)
{
for (int d3 = 0; d3 <= 9; d3++)
{
for (int d4 = 0; d4 <= 9; d4++)
{
int f=1000000*d1 + 100000*d2 +10000*d3 + 1000*d4+100*d3+10*d2 + d1;//(处理回文数...)
if(fun1(f))
{
a[l]=f;
l++;
}
}
}
}
}
//}
//if(a<=999999999&&a>=100000000)//九位数
//{
for (int d1 = 1; d1 <= 9; d1+=2)
{ // 只有奇数才会是素数
for (int d2 = 0; d2 <= 9; d2++)
{
for (int d3 = 0; d3 <= 9; d3++)
{
for (int d4 = 0; d4 <= 9; d4++)
{
for (int d5 = 0; d5 <= 9; d5++)
{
int f=100000000*d1 + 10000000*d2 +1000000*d3 + 100000*d4+10000*d5+1000*d4+100*d3+10*d2 + d1;//(处理回文数...)
if(fun1(f))
{
a[l]=f;
l++;
}
}
}
}
}
}
//}
//偶数位全为非素数
int m,n;
cin>>m>>n;
for(int s=0; ;s++)
{
if(a[s]<=n&&a[s]>=m)
cout<<a[s]<<endl;
if(a[s]>n)
break;
}
return 0;
}
依旧超时
#include <bits/stdc++.h>
using namespace std;
int fun1(int a)
{
if(a<=1)
return 0;
for(int i=2;i<=sqrt(a);i++)
{
if(a%i==0)
return 0;
}
return 1;
}
int main()
{//用数组存超时,改成直接输出
int m,n;
cin>>m>>n;
for(int i=2;i<=9;i++)
{
if(fun1(i))
{
if(i>=m&&i<=n)
cout<<i<<endl;
}
}
//if(a==11)//除11外,偶数位回文数肯定不为素数
if(11>=m&&11<=n)
cout<<11<<endl;
//if(a>=100&&a<=999)//三位数
//{
for (int d1 = 1; d1 <= 9; d1+=2)
{ // 只有奇数才会是素数
for (int d2 = 0; d2 <= 9; d2++)
{
int f=100*d1 + 10*d2 + d1;//(处理回文数...)
if(fun1(f))
{
if(f>=m&&f<=n)
cout<<f<<endl;
}
}
}
//}
//if(a<=99999&&a>=10000)//五位数
//{
for (int d1 = 1; d1 <= 9; d1+=2)
{ // 只有奇数才会是素数
for (int d2 = 0; d2 <= 9; d2++)
{
for (int d3 = 0; d3 <= 9; d3++)
{
int f=10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)
if(fun1(f))
{
if(f>=m&&f<=n)
cout<<f<<endl;
}
}
}
}
//}
//if(a<=9999999&&a>=1000000)//七位数
//{
for (int d1 = 1; d1 <= 9; d1+=2)
{ // 只有奇数才会是素数
for (int d2 = 0; d2 <= 9; d2++)
{
for (int d3 = 0; d3 <= 9; d3++)
{
for (int d4 = 0; d4 <= 9; d4++)
{
int f=1000000*d1 + 100000*d2 +10000*d3 + 1000*d4+100*d3+10*d2 + d1;//(处理回文数...)
if(fun1(f))
{
if(f>=m&&f<=n)
cout<<f<<endl;
}
}
}
}
}
//}
//if(a<=999999999&&a>=100000000)//九位数
//{
for (int d1 = 1; d1 <= 9; d1+=2)
{ // 只有奇数才会是素数
for (int d2 = 0; d2 <= 9; d2++)
{
for (int d3 = 0; d3 <= 9; d3++)
{
for (int d4 = 0; d4 <= 9; d4++)
{
for (int d5 = 0; d5 <= 9; d5++)
{
int f=100000000*d1 + 10000000*d2 +1000000*d3 + 100000*d4+10000*d5+1000*d4+100*d3+10*d2 + d1;//(处理回文数...)
if(fun1(f))
{
if(f>=m&&f<=n)
cout<<f<<endl;
}
}
}
}
}
}
//}
//偶数位全为非素数
return 0;
}
88分的超时代码
#include <bits/stdc++.h>
using namespace std;
int fun1(int a)
{
if(a<=1)
return 0;
for(int i=2;i<=sqrt(a);i++)
{
if(a%i==0)
return 0;
}
return 1;
}
int main()
{//用数组存超时,改成直接输出
int m,n;
cin>>m>>n;
for(int i=2;i<=9;i++)
{
if(fun1(i))
{
if(i>=m&&i<=n)
cout<<i<<endl;
}
}
//if(a==11)//除11外,偶数位回文数肯定不为素数
if(11>=m&&11<=n)
cout<<11<<endl;
//if(a>=100&&a<=999)//三位数
//{
if(m<=999&&n>=100)
for (int d1 = 1; d1 <= 9; d1+=2)
{ // 只有奇数才会是素数
for (int d2 = 0; d2 <= 9; d2++)
{
int f=100*d1 + 10*d2 + d1;//(处理回文数...)
if(fun1(f))
{
if(f>=m&&f<=n)
cout<<f<<endl;
}
}
}
//}
//if(a<=99999&&a>=10000)//五位数
//{
if(m<=99999&&n>=10000)
for (int d1 = 1; d1 <= 9; d1+=2)
{ // 只有奇数才会是素数
for (int d2 = 0; d2 <= 9; d2++)
{
for (int d3 = 0; d3 <= 9; d3++)
{
int f=10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)
if(fun1(f))
{
if(f>=m&&f<=n)
cout<<f<<endl;
}
}
}
}
//}
//if(a<=9999999&&a>=1000000)//七位数
//{
if(m<=9999999&&n>=1000000)
for (int d1 = 1; d1 <= 9; d1+=2)
{ // 只有奇数才会是素数
for (int d2 = 0; d2 <= 9; d2++)
{
for (int d3 = 0; d3 <= 9; d3++)
{
for (int d4 = 0; d4 <= 9; d4++)
{
int f=1000000*d1 + 100000*d2 +10000*d3 + 1000*d4+100*d3+10*d2 + d1;//(处理回文数...)
if(fun1(f))
{
if(f>=m&&f<=n)
cout<<f<<endl;
}
}
}
}
}
//}
//if(a<=999999999&&a>=100000000)//九位数
//{
if(m<=999999999&&n>=100000000)
for (int d1 = 1; d1 <= 9; d1+=2)
{ // 只有奇数才会是素数
for (int d2 = 0; d2 <= 9; d2++)
{
for (int d3 = 0; d3 <= 9; d3++)
{
for (int d4 = 0; d4 <= 9; d4++)
{
for (int d5 = 0; d5 <= 9; d5++)
{
int f=100000000*d1 + 10000000*d2 +1000000*d3 + 100000*d4+10000*d5+1000*d4+100*d3+10*d2 + d1;//(处理回文数...)
if(fun1(f))
{
if(f>=m&&f<=n)
cout<<f<<endl;
}
}
}
}
}
}
//}
//偶数位全为非素数
return 0;
}
终于过了
#include <bits/stdc++.h>
using namespace std;
int fun1(int a)
{
if(a<=1)
return 0;
for(int i=2;i<=sqrt(a);i++)
{
if(a%i==0)
return 0;
}
return 1;
}
int main()
{//用数组存超时,改成直接输出
int m,n;
cin>>m>>n;
for(int i=2;i<=9;i++)
{
if(fun1(i))
{
if(i>=m&&i<=n)
cout<<i<<endl;
}
}
//if(a==11)//除11外,偶数位回文数肯定不为素数
if(11>=m&&11<=n)
cout<<11<<endl;
//if(a>=100&&a<=999)//三位数
//{
if(m<=999&&n>=100)
for (int d1 = 1; d1 <= 9; d1+=2)
{ // 只有奇数才会是素数
for (int d2 = 0; d2 <= 9; d2++)
{
int f=100*d1 + 10*d2 + d1;//(处理回文数...)
if(fun1(f))
{
if(f>=m&&f<=n)
cout<<f<<endl;
}
}
}
//}
//if(a<=99999&&a>=10000)//五位数
//{
if(m<=99999&&n>=10000)
for (int d1 = 1; d1 <= 9; d1+=2)
{ // 只有奇数才会是素数
for (int d2 = 0; d2 <= 9; d2++)
{
for (int d3 = 0; d3 <= 9; d3++)
{
int f=10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)
if(fun1(f))
{
if(f>=m&&f<=n)
cout<<f<<endl;
}
}
}
}
//}
//if(a<=9999999&&a>=1000000)//七位数
//{
if(m<=9999999&&n>=1000000)
for (int d1 = 1; d1 <= 9; d1+=2)
{ // 只有奇数才会是素数
for (int d2 = 0; d2 <= 9; d2++)
{
for (int d3 = 0; d3 <= 9; d3++)
{
for (int d4 = 0; d4 <= 9; d4++)
{
int f=1000000*d1 + 100000*d2 +10000*d3 + 1000*d4+100*d3+10*d2 + d1;//(处理回文数...)
if(fun1(f))
{
if(f>=m&&f<=n)
cout<<f<<endl;
}
}
}
}
}
//}
//if(a<=999999999&&a>=100000000)//九位数 九位数不存在回文质数
//{
/*if(m<=999999999&&n>=100000000)
for (int d1 = 1; d1 <= 9; d1+=2)
{ // 只有奇数才会是素数
for (int d2 = 0; d2 <= 9; d2++)
{
for (int d3 = 0; d3 <= 9; d3++)
{
for (int d4 = 0; d4 <= 9; d4++)
{
for (int d5 = 0; d5 <= 9; d5++)
{
int f=100000000*d1 + 10000000*d2 +1000000*d3 + 100000*d4+10000*d5+1000*d4+100*d3+10*d2 + d1;//(处理回文数...)
if(fun1(f))
{
if(f>=m&&f<=n)
cout<<f<<endl;
}
}
}
}
}
}*/
//}
//偶数位全为非素数
return 0;
}
正解
#include <bits/stdc++.h>
using namespace std;
int fun1(int a)
{
if(a<=1)
return 0;
for(int i=2;i<=sqrt(a);i++)
{
if(a%i==0)
return 0;
}
return 1;
}
int main()
{
int m,n;
cin>>m>>n;
for(int i=2;i<=9;i++)
{
if(fun1(i))
{
if(i>=m&&i<=n)
cout<<i<<endl;
}
}
if(11>=m&&11<=n)
cout<<11<<endl;
if(m<=999&&n>=100)
for (int d1 = 1; d1 <= 9; d1+=2)
{
for (int d2 = 0; d2 <= 9; d2++)
{
int f=100*d1 + 10*d2 + d1;
if(fun1(f))
{
if(f>=m&&f<=n)
cout<<f<<endl;
}
}
}
if(m<=99999&&n>=10000)
for (int d1 = 1; d1 <= 9; d1+=2)
{
for (int d2 = 0; d2 <= 9; d2++)
{
for (int d3 = 0; d3 <= 9; d3++)
{
int f=10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;
if(fun1(f))
{
if(f>=m&&f<=n)
cout<<f<<endl;
}
}
}
}
if(m<=9999999&&n>=1000000)
for (int d1 = 1; d1 <= 9; d1+=2)
{
for (int d2 = 0; d2 <= 9; d2++)
{
for (int d3 = 0; d3 <= 9; d3++)
{
for (int d4 = 0; d4 <= 9; d4++)
{
int f=1000000*d1 + 100000*d2 +10000*d3 + 1000*d4+100*d3+10*d2 + d1;
if(fun1(f))
{
if(f>=m&&f<=n)
cout<<f<<endl;
}
}
}
}
}
return 0;
}