描述
現在給出你一些數,要求你寫出一個程式,輸出這些整數相鄰最近的素數,並輸出其相距長度。如果左右有等距離長度素數,則輸出左側的值及相應距離。
如果輸入的整數本身就是素數,則輸出該素數本身,距離輸出0
輸入
第一行給出測試資料組數N(0<N<=10000)
接下來的N行每行有一個整數M(0<M<1000000),
輸出
每行輸出兩個整數 A B.
其中A表示離相應測試資料最近的素數,B表示其間的距離。
樣例輸入
3
6
8
10
樣例輸出
5 1
7 1
11 1
-----------------------------------------標準分界線----------------------------------------------
第一次寫這個題目的程式,我忘了什麼是素數了,然後百度了下。。。。所謂素數就是大於1的數,且該數只能被1和其本身整除。
-----------------------------------------------------------------------------------------------------
以下是我自己寫的幾次程式,前幾次的程式在上傳OJ時出現了超時執行的錯誤導致無法上傳成功。。。。。。。。。。。(這個OJ是在為難我胖虎。。。。。。。。。。。)
1)
1 #include<iostream> 2 #include<cmath> 3 4 using namespace std; 5 6 int isPrime(int n) 7 { 8 if (n < 2) 9 return 0; 10 else 11 { 12 for (int i = 2; i <= sqrt(n); i++) 13 { 14 if (n%i == 0) 15 return 0; 16 } 17 return 1; 18 } 19 } 20 21 int main() 22 { 23 int M, N; 24 cin>>N; 25 while (N--) 26 { 27 for (int i = 0; i < N; i++) 28 { 29 int A, B; 30 cin >> M; 31 32 for (int i = 1; i < 1000000; i++) 33 { 34 if (isPrime(M)) 35 { 36 cout << M << " " << 0 << endl; 37 break; 38 } 39 A = M - i; 40 if (isPrime(A)) 41 { 42 cout << A << " " << i << endl; 43 break; 44 } 45 B = M + i; 46 if (isPrime(B)) 47 { 48 cout << B << " " << i << endl; 49 break; 50 } 51 } 52 } 53 } 54 return 0; 55 }
2)
1 #include<iostream> 2 #include<cmath> 3 4 using namespace std; 5 6 int isPrime(int n) 7 { 8 if (n < 2) 9 return 0; 10 else 11 { 12 for (int i = 2; i <= sqrt(n); i++) 13 { 14 if (n%i == 0) 15 return 0; 16 } 17 return 1; 18 } 19 } 20 21 int main() 22 { 23 int M, N; 24 cin>>N; 25 if(N>0&&N<=10000) 26 { 27 while (N--) 28 { 29 for (int i = 0; i < N; i++) 30 { 31 int A, B; 32 cin >> M; 33 34 for (int i = 1; i < 1000000; i++) 35 { 36 if (isPrime(M)) 37 { 38 cout << M << " " << 0 << endl; 39 break; 40 } 41 A = M - i; 42 if (isPrime(A)) 43 { 44 cout << A << " " << i << endl; 45 break; 46 } 47 B = M + i; 48 if (isPrime(B)) 49 { 50 cout << B << " " << i << endl; 51 break; 52 } 53 } 54 } 55 } 56 } 57 else 58 { 59 cout<<"Input Error!"<<endl; 60 } 61 return 0; 62 }
以上的程式都是超時但是能進行執行的,就是執行速度太慢。(我也很絕望啊。。。。。。。。。。。。。)
這是改進後的程式:
1#include<iostream> 2 #include<cmath> 3 4 using namespace std; 5 6 int isPrime(int n) 7 { 8 if (n < 2) 9 return 0; 10 else 11 { 12 for (int i = 2; i <= sqrt(n); i++) 13 { 14 if (n%i == 0) 15 return 0; 16 } 17 return 1; 18 } 19 } 20 21 int main() 22 { 23 int M, N; 24 25 while (cin>>N) 26 { 27 for (int i = 0; i < N; i++) 28 { 29 int A, B; 30 cin >> M; 31 32 for (int i = 1; i < 1000000; i++) 33 { 34 if (isPrime(M)) 35 { 36 cout << M << " " << 0 << endl; 37 break; 38 } 39 A = M - i; 40 if (isPrime(A)) 41 { 42 cout << A << " " << i << endl; 43 break; 44 } 45 B = M + i; 46 if (isPrime(B)) 47 { 48 cout << B << " " << i << endl; 49 break; 50 } 51 } 52 } 53 } 54 return 0; 55 }
時間稍微縮短一些,勉強通過測試。。。。。。。。。。。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
這個是待解決的程式:(我想縮短更多的時間)
#include<iostream> #include<cmath> using namespace std; int isPrime(int n) { if (n < 2) return 0; else { for (int i = 2; i <= sqrt(n); i++) { if (n%i == 0) return 0; } return 1; } } int main() { int M, N; cin >> N; while (N--) { cin >> M; int dis = 0; for(int i=1;i<1000000;i++) { if ( isPrime(M - dis)) { cout << M - dis << " " << dis << endl; break; } else if (isPrime(M + dis)) { cout << M - dis << " " << dis << endl; break; } dis++; } } return 0; }
這個程式的執行測試的幾組都不行,比如1,10.。。。。。