蓝桥杯——求超级质数

问题描述

如果一个质数 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;
}

运行截图

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值