判断回文质数(C++)

以这道洛谷的题为例: 

洛谷P1217icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P1217这道题要求需要判断区间[a,b]中的所有回文质数,并且测试数据开到了1亿

首先,判断质数,如果暴力求解,会导致直接超时

所以,这里使用埃氏算法(主要我不会写欧拉算法)

void checkisprime(long long isprime[],long long n)
{
	long long sn = sqrt(n);
	for (int i = 2; i <= sn; i++)
	{
		if (isprime[i] == 0)
		{
			for (int j = 2; j <= n/i; j++)
				isprime[i*j] = 1;
		}
	}
}

直接打表,不再说明

判断回文数,我的思路是数字转换为字符串然后判断,也可以将数字翻转再判断

bool ishuiwen(long long n)
{
	string s;
	s = to_string(n);
	int start = 0, end = s.size() - 1;
	while (start < end)
	{
		if (s[start++] != s[end--])
			return false;
	}
	return true;
}

补充:to_string库函数,将数字直接赋值给string变量,需要引用<string>头文件

下面是主函数,有三个细节:

1)除了11之外,数字的位数为偶数的回文数一定是11的倍数,所以我们可直接省去1亿到1千万的数据判断。

2)打表数组,需要将数组的元素全部置为同一个数,在如此大的数据量下,memset函数(<ctstring>库下)可以快速的赋值,远远比利用循环赋值要快(但是只能赋值为0和-1)。

3)在最后的循环判断中,可以直接跳过偶数,也能快点。

int main()
{
	long long a, b;
	cin >> a >> b;
	long long isprime[10000001];
	memset(isprime, 0,sizeof(isprime));
	if (b > 10000000) b = 10000000;
	checkisprime(isprime, b);
	if (a % 2 == 0) a++;
	for (int i = a; i <= b; i+=2)
	{
		if (isprime[i] == 0 && ishuiwen(i))
		{
			cout << i << endl;
		}
	}
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值