《ACM程序设计》书中题目 R

来源:互联网 发布:马小丝的淘宝 编辑:程序博客网 时间:2024/06/05 10:21

题目简要:

这道题主要就是个筛素数的问题···

如果大于1的整数的正的除数(因子)为1,则称为质数。 例如,2,11,67,89是素数,但8,20,27不是。
半主数字定义
如果大于1的整数可以被分解为两个质数,则称为半质数。 例如,6是半质数,但12不是。
您的任务只是确定给定的数字是否是半质数。

输入

在输入中有几个测试用例。 每种情况包含单个整数N(2≤N≤1,000,000)

输出

每行一个整数。 如果数字是半质数,则输出“是”,否则输出“否”。

例如:

Sample Input

3
4
6
12

Sample Output

No
Yes
Yes
No

解题思路:

······好吧,我记得老师上课的时候提到过,不过具体的方法忘记了····无奈,用自己想到的办法总是超时,于是用了题解上的方法。先找出素数,再通过循环判断这个数是不是半素数就好啦。

附代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int i,j;
    vector <int> b;
    for(int i=2;i<=500000;i++)
    {
        if(i!=2&& i%2==0)
            continue;
        for(int j=3;j*j<=i;j+=2)
        {
            if(i%j==0)goto p;
        }
        b.push_back(i);
    p:continue;
    }
    set <int> s;
    for (i=0;i<b.size();i++)
    {
        for (j=0;j<b.size();j++)
        {
            if (b[i]*b[j]<1000000)
                s.insert(b[i]*b[j]);
            else
                break;
        }
    }
    int n;
    set<int>::iteratorit;
    while (cin>>n)
    {
        it=s.find(n);
        if (it!=s.end())
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
    }
    return 0;
}

解题感受:

其实还是没有太看懂课本上筛素数的方法,回去仔细研究去,可是后来我去网上找了百度百科里的筛素数的方法,我一开始想到的方法和百度的方法其实是一样的,然而解决不了超时的问题·····


0 0