難度2:素數距離問題

weixin_30588675發表於2020-04-05
描述
現在給出你一些數,要求你寫出一個程式,輸出這些整數相鄰最近的素數,並輸出其相距長度。如果左右有等距離長度素數,則輸出左側的值及相應距離。
如果輸入的整數本身就是素數,則輸出該素數本身,距離輸出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.。。。。。

 

 

轉載於:https://www.cnblogs.com/Dark-King/p/8011897.html

相關文章