先看题:
题目描述
给定一个数字𝑛,判断其是不是回文质数。 回文质数的定义就是该数字既是一个回文数,也是一个质数。回文数:形如12211221,1232112321都是一个回文数。质数:2,3,5,7,11,132,3,5,7,11,13等
也就是保证它是回文数的前提下,还得让它在是一个质数。
或者保证它是质数的前提下,再去保证它是一个回文数。
输入格式
一个整数n
输出格式
如果是回文质数,输出 𝑌𝑒𝑠 否则输出 𝑁𝑜
输入数据 1
383
输出数据 1
Yes
输入数据 2
22
输出数据 2
No
数据规模与约定
对于 100%的数据,0<𝑛≤10^5
呃,今天的话我给大家带来一种非常不靠谱的方法,但也是一种非常靠谱的方法,简单来说就是动歪脑筋的方法。
由于这道题他数组规模的约定,n最大只需要是10的5次方,那么就让我们有机可乘,我们可以通过打表的方法将从1~10^5的所有回文质数全都打出来。可能非常费手与肝,但大家可以去网上找表。
不过既然看到了我的文章那就算幸运,现在我把表直接放在这里。
int c[1000] = { 5,7,11,101,131,151,181,191,313,353,373,383,727,757,787,797,919,929,10301,10501,10601,11311,11411,12421,12721,12821,13331,13831,13931,14341,14741,15451,15551,16061,16361,16561,16661,17471,17971,18181,18481,19391,19891,19991,30103,30203,30403,30703,30803,31013,31513,32323,32423,33533,34543,34843,35053,35153,35353,35753,36263,36563,37273,37573,38083,38183,38783,39293,70207,70507,70607,71317,71917,72227,72727,73037,73237,73637,74047,74747,75557,76367,76667,77377,77477,77977,78487,78787,78887,79397,79697,79997,90709,91019,93139,93239,93739,94049,94349,94649,94849,94949,95959,96269,96469,96769,97379,97579,97879,98389,98689};
接下来我们就可以直接使用便利的方法。输入一个数遍历表中的每一个数,如果相等,那么就输出Yes,如果不相等就输出No。但是问题又来了,遍历次数应该是多少?由于我们现在事先还不知道一共有多少个,所以我们还需要新建一个程序,用一个for循环,如果这个数不等于0,那么ans++,然后得出我们最后的数量。
#include <iostream>
using namespace std;
int main()
{
int ans=0;
int c[1000] = { 5,7,11,101,131,151,181,191,313,353,373,383,727,757,787,797,919,929,10301,10501,10601,11311,11411,12421,12721,12821,13331,13831,13931,14341,14741,15451,15551,16061,16361,16561,16661,17471,17971,18181,18481,19391,19891,19991,30103,30203,30403,30703,30803,31013,31513,32323,32423,33533,34543,34843,35053,35153,35353,35753,36263,36563,37273,37573,38083,38183,38783,39293,70207,70507,70607,71317,71917,72227,72727,73037,73237,73637,74047,74747,75557,76367,76667,77377,77477,77977,78487,78787,78887,79397,79697,79997,90709,91019,93139,93239,93739,94049,94349,94649,94849,94949,95959,96269,96469,96769,97379,97579,97879,98389,98689};
for(int i=0;i<1000;i++)
{
if(c[i]!=0)
{
ans++;
}
}
cout<<ans;
return 0;
}
结果是111
我们还有,那就是如何要输出yes还是no?其实非常简单,我们只需要定义一个布尔变量f,然后的话先初始化为0,表示这个数暂还不是回文质数,如果找到了,那么就将f变成1,然后跳出循环,下面,条件判断if如果f是不成立的,那么就输出no,否则就什么也不用干。
if(!f) cout<<"No";
接下来,就是正式代码
#include<iostream>
using namespace std;
int main()
{
int c[1000] = { 5,7,11,101,131,151,181,191,313,353,373,383,727,757,787,797,919,929,10301,10501,10601,11311,11411,12421,12721,12821,13331,13831,13931,14341,14741,15451,15551,16061,16361,16561,16661,17471,17971,18181,18481,19391,19891,19991,30103,30203,30403,30703,30803,31013,31513,32323,32423,33533,34543,34843,35053,35153,35353,35753,36263,36563,37273,37573,38083,38183,38783,39293,70207,70507,70607,71317,71917,72227,72727,73037,73237,73637,74047,74747,75557,76367,76667,77377,77477,77977,78487,78787,78887,79397,79697,79997,90709,91019,93139,93239,93739,94049,94349,94649,94849,94949,95959,96269,96469,96769,97379,97579,97879,98389,98689};
int a;
cin>>a;
bool f=0;
for(int i=0;i<111;i++)
{
if(a==c[i])
{
cout<<"Yes";
f=1;
break;
}
}
if(!f) cout<<"No";
}
AC:
100 Accepted
# | 状态分数 | 耗时 | 内存占用 |
---|---|---|---|
#1 | Accepted10 | 0ms | 7.6 MiB |
#2 | Accepted10 | 0ms | 7.5 MiB |
#3 | Accepted10 | 1ms | 7.6 MiB |
#4 | Accepted10 | 1ms | 7.5 MiB |
#5 | Accepted10 | 1ms | 7.6 MiB |
#6 | Accepted10 | 0ms | 7.7 MiB |
#7 | Accepted10 | 0ms | 7.5 MiB |
#8 | Accepted10 | 1ms | 7.6 MiB |
#9 | Accepted10 | 1ms | 7.7 MiB |
#10 | Accepted10 | 1ms | 7.6 MiB |
好了,本期文章就到这里,总而言之,记住这么6句话:(点个赞吧求求了)
打表过样例,暴力出奇迹
要是想把分数偷,贪心打表加暴搜
快读快写火车头,马上AC不用愁
(这是某位大佬用户的座右铭)