如果n 和 n + 2 都是素数。则称他们为孪生素数。
输入m。输出两个均不超过m的最大孪生素数。5 <= m <= 1000.
例如 m = 20 答案为 17, 19. m = 1000时,答案为 881, 883.
// // main.cpp // c++prime // // Created by SJCHEN on 2019/1/19. // Copyright © 2019 SJCHEN. All rights reserved. // #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cassert> #include <cmath> using namespace std; int is_prime(int x) { int i; for (i = 2; I*i <= x; i++) if (x % i == 0) return 0; return 1; } int main() { int i,m; cin >> m; for (i = m - 2; i >= 3; i--) { if (is_prime(i) && is_prime(i+2)) { cout << i << " " << i+2 << endl; break; } } return 0; }
但是上面如果m过大,则可能会出现溢出,正确的做法应该是
// // main.cpp // c++prime // // Created by SJCHEN on 2019/1/19. // Copyright © 2019 SJCHEN. All rights reserved. // #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cassert> #include <cmath> using namespace std; int is_prime(int x) { int i,m; assert(x >= 0);//当x< 0 时,程序将异常终止 if (x == 1) return 0; m = floor(sqrt(x) + 0.5); for (i = 2; i <= m; i++) if (x % i == 0) return 0; return 1; } int main() { int i,m; cin >> m; for (i = m - 2; i >= 3; i--) { if (is_prime(i) && is_prime(i+2)) { cout << i << " " << i+2 << endl; break; } } return 0; }