TX2017秋招笔试题之素数对
Posted 左岸繁华右岸殇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TX2017秋招笔试题之素数对相关的知识,希望对你有一定的参考价值。
问题描述:
给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))
输入描述:
输入包括一个整数n,(3 ≤ n < 1000)
输出描述:
输出对数
示例1
输入
10
输出
2
————————————————————————————————————————————————
解决思路;
首先判断素数(在大于1的自然数中,除了1和它本身以外不再有其他因数,这样的数称为质数:2,3,5,7,11,。。。),不必多讲,然后所给范围的素数集合,再求解
思路一:
#include<iostream> #include<math.h> using namespace std; int IsPrime(int n); int main() { int N; cin>>N; int *arr=new int[N]; int j=0; int num=0; for(int i=2;i<=N;i++){ if(IsPrime(i)) { arr[j++]=i; } } for(int m=0;m<j;m++) for(int n=m;n<j;n++) { if(arr[n]+arr[m]==N) num++; } cout<<num; delete arr; return 0; } int IsPrime(int n){ if(n==1) return 0; for(int i=2;i<=sqrt(n);i++) if(n%i==0) return 0; return 1; }
思路二:
若N是素数,那么N的倍数就都不是素数了,可以通过这种方法把素数筛选出来
2是素数,那么就把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
#include <iostream> #include <vector> using namespace std; int main(){ //筛选法求素数(删除所有素数的倍数) vector<int> v(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; }
以上是关于TX2017秋招笔试题之素数对的主要内容,如果未能解决你的问题,请参考以下文章