1. 程式人生 > >騰訊2017秋招筆試程式設計題(三)---素數對

騰訊2017秋招筆試程式設計題(三)---素數對

騰訊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