腾讯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