判断回文质数(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变量,需要引用头文件

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

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

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

你可能感兴趣的:(C++算法,算法)