问题描述
如果一个质数 PP 的每位数字都是质数, 而且每两个相邻的数字组成的两位 数是质数, 而且每三位相邻的数字组成的三位数是质数, 依次类推, 如果每相 邻的 kk 位数字组成的 kk 位数都是质数, 则 PP 称为超级质数。
如果把超级质数 PP 看成一个字符串, 则这个超级质数的每个子串都是质 数。
例如, 53 是一个超级质数。
请问, 最大的超级质数是多少?
答案提交
这是一道结果填空的题, 你只需要算出结果后提交即可。本题的结果为一 个整数, 在提交答案时只填写这个整数, 填写多余的内容将无法得分。
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
解题思路
1.寻找所有质数
2.从得到的所有质数中,求出全部子串
3.依次判断全部子串,如果某一子串不是质数,返回寻找下一个质数
一、寻找质数
判断一个数是否是质数
bool Is_Prime(int num)
{
if (num <= 3)//判断是否小于3
{
return num > 1;
}
if (num % 6 != 1 && num % 6 != 5)//判断是否为6x-1或者6x+1
{
return false;
}
if (num % 2 == 0)//判断能否被2整除
{
return false;
}
for (size_t i = 3; i < sqrt(num); i += 2)//判断能否被小于自身的数整除
{
if (num % i == 0)
{
return false;
}
}
return true;
}
二、找出全部子串
分三步
1.求数字一共有几位
int get_num_size(int num)
{
int ans = 0;
int n = num;
while (n)
{
n /= 10;
ans++;
}
return ans;
}
2.将数字的每一位都用数组表示
vector<int> get_num(int& num, vector<int>& digit)
{
int val = 0;
for (int size = get_num_size(num); size > 0; size--)
{
val = num % (int)pow(10.0, size);
val = val / (int)pow(10.0, size - 1);
digit.push_back(val);
}
return digit;
}
3.求出全部子串
/*求出全部子串*/
vector<int>& get_all(int& num, vector<int>& r)
{
vector<int>digit_num;
//数字的每一位都用数组表示,存储在数组digit_num里面
get_num(num, digit_num);
int digit = get_num_size(num);
for (int i = 0; i < digit; i++)
{
for (int j = 0; j < digit - 1; j++)
{
string buf;
int k = 0;
while (k <= i)
{
//用字符串的+=操作进行拼接
buf += to_string(digit_num.at(j + k));
k++;
}
//再把拼接后的子串转化为整数
r.push_back(stoi(buf));
}
}
return r;
}
三、依次判断是否为质数
int main()
{
for (int i = 0; i < 10000; i++)
{
if (Is_Prime(i))
{
//在质数中进行超级质数的检查
vector<int>buf;
get_all(i, buf);
int sign = 1;
for (int j = 0; j < buf.size(); j++)
{
if (!Is_Prime(buf.at(j)))
{
sign = 0; break;
}
}
if (sign)
cout << i << " is super prime!" << endl;
}
}
return 0;
}
完整代码
#include<iostream>
#include<vector>
#include<math.h>
#include<string>
using namespace std;
bool Is_Prime(int num)
{
if (num <= 3)//判断是否小于3
{
return num > 1;
}
if (num % 6 != 1 && num % 6 != 5)//判断是否为6x-1或者6x+1
{
return false;
}
if (num % 2 == 0)//判断能否被2整除
{
return false;
}
for (size_t i = 3; i < sqrt(num); i += 2)//判断能否被小于自身的数整除
{
if (num % i == 0)
{
return false;
}
}
return true;
}
/*求数字位数*/
int get_num_size(int num)
{
int ans = 0;
int n = num;
while (n)
{
n /= 10;
ans++;
}
return ans;
}
/*数组表示*/
vector<int> get_num(int& num, vector<int>& digit)
{
int val = 0;
for (int size = get_num_size(num); size > 0; size--)
{
val = num % (int)pow(10.0, size);
val = val / (int)pow(10.0, size - 1);
digit.push_back(val);
}
return digit;
}
/*求出全部子串*/
vector<int>& get_all(int& num, vector<int>& r)
{
vector<int>digit_num;
//数字的每一位都用数组表示,存储在数组digit_num里面
get_num(num, digit_num);
int digit = get_num_size(num);
for (int i = 0; i < digit; i++)
{
for (int j = 0; j < digit - i; j++)
{
string buf;
int k = 0;
while (k <= i)
{
//用字符串的+=操作进行拼接
buf += to_string(digit_num.at(j + k));
k++;
}
//再把拼接后的子串转化为整数
r.push_back(stoi(buf));
}
}
return r;
}
/*依次判断是否为质数*/
int main()
{
for (int i = 0; i < 10000; i++)
{
if (Is_Prime(i))
{
//在质数中进行超级质数的检查
vector<int>buf;
get_all(i, buf);
int sign = 1;
for (int j = 0; j < buf.size(); j++)
{
if (!Is_Prime(buf.at(j)))
{
sign = 0; break;
}
}
if (sign)
cout << i << " is super prime!" << endl;
}
}
return 0;
}
运行截图