騰訊2017秋招筆試程式設計題(三)---素數對
阿新 • • 發佈:2019-02-10
騰訊2017秋招筆試程式設計題(三)—素數對
時間限制:1秒
空間限制:32768K
給定一個正整數,編寫程式計算有多少對質數的和等於輸入的這個正整數,並輸出結果。輸入值小於1000。
如,輸入為10, 程式應該輸出結果為2。(共有兩對質數的和為10,分別為(5,5),(3,7))
輸入描述:
輸入包括一個整數n,(3 ≤ n < 1000)
輸出描述:
輸出對數
輸入例子1:
10
輸出例子1:
2
自己實現的程式碼如下:
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
bool is_prime_num(int num)
{
for(int i=2;i<sqrt(num)+1;++i)
{
if( !(num % i) )
return false;
}
return true;
}
int get_last_result(int num,std::vector<int>& v)
{
int count = 0;
bool found = false ;
for (vector<int>::iterator iter = v.begin(); iter != v.end();)
{
int num_to_find = num - (*iter);
if( num_to_find == *iter ){
//cout << "1111 " << *iter << " " << num_to_find << endl;
found = true;
}
else
{
vector<int>::iterator iter_found = std::find(v.begin(),v.end(),num_to_find);
if( iter_found != v.end() ){
//cout << "2222 " << *iter << " " << num_to_find << endl;
found = true;
}
}
if( !found )
{
++iter;
}
else
{
found = false;
v.erase(iter);
count++;
}
}
return count;
}
int main()
{
int num = 0 ;
std::vector<int> v;
cin >> num;
if( num < 3 || num > 1000 )
return 0;
for(int i=3;i<=num;++i){
if( is_prime_num(i) )
{
//cout << i << endl;
v.push_back(i);
}
}
cout << get_last_result(num,v) << endl;
return 0;
}
可以大家一起討論討論。
網上一同學的解法,覺得很犀利,貼在下面,大家可以學習下:
#include <iostream>
#include <vector>
using namespace std;
int main(){
//篩選法求素數(刪除所有素數的倍數)
vector<int> v(1000,1); //宣告一個初始大小為1000且初始值都為1的向量
for(int i=2;i<1000;++i){
for(int j=2;i*j<1000;++j){
if(v[i]){
v[i*j]=0;
}
}
}
int x;
cin>>x;
int res=0;
for(int i=2;i<=x/2;++i){
if(v[i]&&v[x-i]) ++res;
}
cout<<res<<endl;
}
可能直接看程式碼有點晦澀,我把解析也放在下面:
先看到2是素數(v[2]==1),就把1-1000範圍所有2的倍數置為0,此時v[2]、v[4]、v[6]、v[8]....都為0了;
下一次看到3是素數,則把v中3的倍數置為0,v[3]、v[6]、v[9]...都置為0;
下一個素數為5,因為在在第一步時,v[4]被置為0了,接下來把5的倍數都置為0
......
最後,v中素數都為1,非素數都為0