對每個查詢數 M (1 ≤ M < 1e6):
M 0。M-d 是否為素數,是則輸出 M-d d(優先左側)。M+d,是則輸出 M+d d。試除法至 √x,預處理 2,3 為素數,偶數直接返回 false。查詢數 ≤ 10000,單次判定極快,無需篩法預處理。
boolean is_prime(int x) {
if (x < 2) return false;
if (x < 4) return true; // 2,3
for (int i=2; i*i<=x; ++i)
if (x%i==0) return false;
return true;
}
// 主循環
int d = (m%2==0)?1:0;
if (m==1) { print "2 1"; continue; }
while (true) {
if (is_prime(m-d)) { print m-d, d; break; }
if (is_prime(m+d)) { print m+d, d; break; }
d += 2;
}
距離步長 +2 保證只檢查奇數,效率提升一倍。