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;   
}
原文地址:https://www.cnblogs.com/yfz1552800131/p/7497305.html