编程题—质数和质数对

内容会持续更新,有错误的地方欢迎指正,谢谢!

问题1

完美世界2017年笔试题:编写一个程序,将小于n的所有质数找出来。

分析

质数又名素数,取值:2 3 5 7 9 11等等

质数 对 小于自己的质数 求余,不等于0;且小于自己的质数 的范围在[2,sqat(i)]。

代码

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

vector<int> res;
vector<int> CalP(int n)
{
    if(n<2)
        return res;
    res.push_back(2);
    int i,j;
    for(i=3;i<=n;++i)
    {
        for(j=0;j<res.size()&&res[j]<=sqrt(i);++j)
        {
            if(i%res[j]==0)
                break;
        }
        if(j==res.size()||res[j]>sqrt(i))
            res.push_back(i);
    }
    return res;
}

问题2

腾讯2017年笔试题:给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))

输入描述:
输入包括一个整数n,(3 ≤ n < 1000)

输出描述:
输出对数

输入例子:
10

输出例子:
2

分析

任何一个合数(非质数且非1且非0)都能由两个质数相加得到。

步骤:

  1. 先求1000以内的质数并保存在vector容器里。
  2. 假设输入的是sum,那么其中一个质数的取值范围[2,sum/2],另一个质数的取值范围[sum/2,sum-2]。或者,直接利用前后两个游标,不断向中间靠拢来遍历,便可求出最终的对数。

所用数据结构: vector

代码

#include <iostream>
#include <cmath>
#include <vector>
using namespace std;

//求1000以内的素数并保存
int i,j;
void GetPrime(vector<int>& primeNum)
{
    primeNum.push_back(2);
    for(i=3;i<1000;++i)
    {
        for(j=0;j<primeNum.size()&&primeNum[j]<=sqrt(i);++j)
        {
            if(i%j==0)
                break;
        }
        if(isPrime)
            primeNum.push_back(i);
        if(j==primeNum.size()||primeNum[j]>sqrt(i))
            primeNum.push_back(i);
    }
}

//根据sum和primeNum,求满足条件的对数
int PrimePair(int sum)
{
    vector<int> primeNum;
    GetPrime(primeNum);
    int resCount=0;

     /*常规方法
    int midVal=0;
    for(i=0;primeNum[i]<=sum/2;++i)
    {
        midVal=i;
    }
    for(i=0;primeNum[i]<=sum/2;++i)
    {
        for(j=midVal;primeNum[j]<=sum-2;++j)
        {
            if(primeNum[j]+primeNum[i]==sum)
                ++resCount;
        }
    }
    return resCount;
    */

    //另一种方法:用游标。练练手,快忘记游标了。。。
    vector<int>::iterator leftIter = primeNum.begin();
    vector<int>::iterator rightIter = primeNum.end()-1;
    while(leftIter<=rightIter)
    {
        if((*leftIter+*rightIter)==sum)
        {
            ++resCount;
            ++leftIter;
            --rightIter;
        }
        else if((*leftIter+*rightIter)>sum)
            --rightIter;
        else
            ++leftIter;
    }
    return resCount;
}

int main()
{
    int sum=0;
    while(cin>>sum)
    {
        if(sum<=3||sum>=1000)
        {
            cout<<0<<endl;
            continue;
        }
        cout<<PrimePair(sum)<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值