zoukankan      html  css  js  c++  java
  • 杭电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

  • 相关阅读:
    T2487 公交司机(搜索题)(小L的一生)
    T2485 汉诺塔升级版(普及)(递归)
    T2483 电梯(模拟题)
    将图片返回到前端
    session
    TCP协议
    socket
    断点调试
    解析字符串
    Cookie
  • 原文地址:https://www.cnblogs.com/William-xh/p/6986630.html
Copyright © 2011-2022 走看看