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