#include<bits/stdc++.h>
using namespace std;
const int N = 100001;
int p[N],np[N],ans[N][2],t[N];
bool vis[N];
int cntp = 0,ansp = 0;
void primecheck(int n){
np[1] = 1;
for(int i = 2;i<=n;i++){
if(!np[i]) p[++cntp] = i;
for(int j = 1;j<=cntp;j++){
if(i*p[j]>n)break;
np[i*p[j]] = 1;
if(i%p[j]==0) break;
}
}
}
int main(){
int n;
scanf("%d",&n);
primecheck(n<<1);
for(int i = cntp;i;i--){
int num = p[i];
int k = 0;
for(int j = 1;num*j<=n;j++){
int cur = num*j;
if(!vis[cur]) t[++k] = cur;
}
if(k&1){
swap(t[2],t[k]) ;
k--;
}
for(int j = 1;j<=k;j+=2){
vis[t[j]] = vis[t[j+1]] = 1;
ans[++ansp][0] = t[j];
ans[ansp][1] = t[j+1];
}
}
printf("%d\n",ansp);
for(int i = 1;i<=ansp;i++){
printf("%d %d\n",ans[i][0],ans[i][1]);
}
return 0;
}
做法和题解感觉一样,写法也差不多?
但是n=99998的时候T了
本机测试,注释掉输出,程序0.1s结束。
大概率脑抽写错了出现死循环?但是萌新太菜了找不到...
求大佬不吝赐教