首页 > 代码库 > 杭电2098 拆分质数和

杭电2098 拆分质数和

分拆素数和

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 39476    Accepted Submission(s): 17274


Problem Description
把一个偶数拆成两个不同素数的和,有几种拆法呢?
 

 

Input
输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。
 

 

Output
对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。
 

 

Sample Input
30 26 0
 

 

Sample Output
3 2

 

一开始的时候题目给我看错了,题目意思是只要拆分成两个质数就可以了。
具体思路为:

首先我们看到题马上就会有一个for循环的思路去判断小于n的素数.如果是素数 再去找另外一个素数.

那么如何找另外一个素数呢?

答案很简单 令a=n-当前素数,然后判断a是否是素数就行了.

判断素数,就用以前写的 check_prime()即可。

然后 我给出了一份代码:
#include <iostream>
#include<math.h>
#include <iomanip>
#include<cstdio>
#include<string>
#include<map>
#include<vector>
#include<list>
#include<algorithm>
#include<stdlib.h>
#include<iterator>
#include<sstream>
#include<string.h>
using namespace std;

int chenck_prime(int num)//素数返回1
{
    if(num<=0){
        return 0;//小于0 不是素数
    }
    else if(num==1){
        return 0;// 1 也不是
    }
    else if(num==2){
        return 1;
    }
    else{
        for(int i=2;i<num;i++){
            if(num%i==0){
                return 0;//要是还有其它能被他整除的数,那也不是素数
            }
        }
        return 1;
    }
}

int main()
{
    int n;
    while(cin>>n)
    {
        int cnt=0;
        if(n==0)
        {
            break;
        }
        for(int i=2;i<n/2;i++)
        {
            if(chenck_prime(i)&&chenck_prime(n-i)&&n-i!=i)
            {
                cnt++;
            }

        }
        cout<<cnt<<endl;
    }
    return 0;
}

然后显示的是代码超时了。可以看得出来,我的算法好像太冗长了。

然后开始改进代码:

1.我们知道偶数不可能是素数

2.我们知道如果两个素数不同.一定是一个素数小于t/2一个素数大于t/2没有任何其他实例反驳掉这个结论

3.判断是否是素数也有更好的办法。

所以,写出了这么一个算法

#include <iostream>
#include<math.h>
#include <iomanip>
#include<cstdio>
#include<string>
#include<map>
#include<vector>
#include<list>
#include<algorithm>
#include<stdlib.h>
#include<iterator>
#include<sstream>
#include<string.h>
using namespace std;

int chenck_prime(int num)//素数返回1
{
    if(num<=0){
        return 0;//小于0 不是素数
    }
    for(int i=2;i<=sqrt(num);i++)//用小于根号这样的话更快一点
    {
        if(num%i==0)
        {
            return 0;
        }

    }
    return 1;
}

int main()
{
    int n;
    while(cin>>n)
    {
        int cnt=0;
        if(n==0)
        {
            break;
        }
        for(int i=3;i<n/2;i+=2)
        {
            if(chenck_prime(i)&&chenck_prime(n-i)&&n-i!=i)
            {
                cnt++;
            }

        }
        cout<<cnt<<endl;
    }
    return 0;
}

然后就给ac了。

思路参考:http://blog.csdn.net/mengxiang000000/article/details/50313809

杭电2098 拆分质数和