タイトルの説明:
アルゴリズムのアイデア:
- 指定された数mの連続合成数を見つけると、2つの素数によって形成される区間を直接列挙できます。
- 素数の決定に関しては、偶数の素数は1つ、つまり2しかなく、奇数の最小の素数は3です。
// 判断是否为质数
for(int j=2;j<sqrt(next)+1;j++)
if(next%j==0){
t=0;
break;
}
- 既知の条件によれば、m> = 1なので、直接3から始めて素数を探し(2より大きい偶数は合成数であるためnext + = 2)、次に判断します(2つの素数にはmより大きい合成数が含まれます)。以上)
// 合数区间长度判定:next-pre
if(next-pre>m){
if(m!=1)
cout<<pre+1<<' '<<pre+m<<endl;
else
cout<<pre+1<<endl;
break;
}
すべてのコード:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 10;
int a[N] = {
0};
int m;
int main(){
cin>>m;
int next = 3,pre=3;
while(1){
int t=1;
// 判断是否为质数
for(int j=2;j<sqrt(next)+1;j++)
if(next%j==0){
t=0;
break;
}
// 合数区间长度判定:next-pre
if(next-pre>m){
if(m!=1)
cout<<pre+1<<' '<<pre+m<<endl;
else
cout<<pre+1<<endl;
break;
}
if(t) pre = next;
next+=2;
}
return 0;
}
演算結果: