素數距離問題

2021-07-30 01:45:58 字數 1840 閱讀 9465

描述

現在給出你一些數,要求你寫出乙個程式,輸出這些整數相鄰最近的素數,並輸出其相距長度。如果左右有等距離長度素數,則輸出左側的值及相應距離。

如果輸入的整數本身就是素數,則輸出該素數本身,距離輸出0

輸入 第一行給出測試資料組數n(0 < n <= 10000)

接下來的n行每行有乙個整數m(0 < m < 1000000),

輸出 每行輸出兩個整數 a b.

其中a表示離相應測試資料最近的素數,b表示其間的距離。

樣例輸入

3 6

8 10

樣例輸出

5 1

7 1

11 1

下面**解決了上述問題的功能,但是時間卻超時了,在想想其他的方法優化**:

#include 

#include

#include

using

namespace

std;

typedef

struct a

node;

int main()

k = node_i[i] + 1;

while(k--)

}if(flag == 0)

flag = 0;

}k = node_i[i];

while(k)

}if(flag == 0)

break;

}flag = 0;k++;}}

for(int i = 0 ; i < n ; i++)

return

0;}

演算法思路:

將輸入的數字先找前面第 i 位,在對應找後面第 i 位,如果找到前面的返回,如果找到後面的返回。

這樣大大縮小了查詢素數的個數引起的不必要迴圈。

優化**1(用函式呼叫是**簡單而且容易看懂,**1優化把原來的o(n^2)轉換成o(1)):

#include 

#include

#include

#include

using

namespace

std;

typedef

struct a

node;

bool is_prime(int num)

int main()

else

}//**最大優化部分

node[i].pro = k;

node[i].dec = abs(k - m);

j = 1;flag = 1;

}for(int i = 0 ; i < n ; i++)

return

0;}

優化**2:

#include

#include

using

namespace

std;

bool isprime(int n)

//這個比上述**優化好多

int main()

for(i = num; !isprime(i); i--);

for(j = num; !isprime(j); j++);//這倆個迴圈比上面巧妙一點。

if((num - i) <= (j - num))

cout

<< i << ' '

<< (num - i) << endl;

else

if((num - i) > (j - num))

cout

<< j << ' '

<< (j - num) << endl;

}}

素數距離問題

時間限制 3000 ms 記憶體限制 65535 kb 難度 2 描述 現在給出你一些數,要求你寫出乙個程式,輸出這些整數相鄰最近的素數,並輸出其相距長度。如果左右有等距離長度素數,則輸出左側的值及相應距離。如果輸入的整數本身就是素數,則輸出該素數本身,距離輸出0 輸入第一行給出測試資料組數n 0輸...

素數距離問題

時間限制 3000 ms 記憶體限制 65535 kb 難度 2 描述 現在給出你一些數,要求你寫出乙個程式,輸出這些整數相鄰最近的素數,並輸出其相距長度。如果左右有等距離長度素數,則輸出左側的值及相應距離。如果輸入的整數本身就是素數,則輸出該素數本身,距離輸出0 輸入第一行給出測試資料組數n 0輸...

素數距離問題

時間限制 3000 ms 記憶體限制 65535 kb 難度 2 描述 現在給出你一些數,要求你寫出乙個程式,輸出這些整數相鄰最近的素數,並輸出其相距長度。如果左右有等距離長度素數,則輸出左側的值及相應距離。如果輸入的整數本身就是素數,則輸出該素數本身,距離輸出0 輸入第一行給出測試資料組數n 0 ...