算法刷题记录:素数中的等差数列
题目链接
https://ac.nowcoder.com/acm/contest/19859/I
题目分析
模拟!模拟!模拟!下标要计算好。
自己的思路是放发现两个相等的差时,说明至少可以输出了,也就是合法情况,
然后用指针R往后扩展。我选择的R是闭区间的,即[L,R]
的区间已经看过了,所以i可以直接从i+1开始看。
所以R赋值给i后,i自动加1。
AC代码
// Problem: 素数中的等差数列
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/19859/I
// Memory Limit: 524288 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <iostream>
using namespace std;
const int N = 100050;
int l, r;
int st[N], primes[N], cnt;
int main()
{
for (int i = 2; i <= N; ++ i)
if (!st[i])
{
primes[cnt ++ ] = i;
for (int j = i + i; j <= N; j += i)
st[j] = true;
}
cin >> l >> r;
for (int i = 0; i < cnt; ++ i)
{
if (primes[i] < l) continue;
if (primes[i] > r) break;
// 说明有一组相等的
if (primes[i + 1] - primes[i] == primes[i + 2] - primes[i + 1])
{
int L = i, R = i + 2;
// 判断R是否可以往后扩大
while (primes[R] - primes[R - 1] == primes[R + 1] - primes[R]) ++ R;
for (int j = L; j <= R; ++ j) cout << primes[j] << ' ';
cout << endl;
i = R;
}
}
}
本文来自博客园,作者:想个昵称好难ABCD,转载请注明原文链接:https://www.cnblogs.com/ClockParadox43/p/17454316.html