• 分拆素数和(素数打表)


    Problem Description
    把一个偶数拆成两个不同素数的和,有几种拆法呢?
     
    Input
    输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。
     
    Output
    对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。
     
    Sample Input
    30 26 0
     
    Sample Output
    3 2
     
    Source

    自己写了一个素数打表的函数

    bool isPrime(int x)
    {
        for(int i = 2; i * i < x; i++)
        {
            if(x % i == 0) return false;
        }
        return x != 1;
    }    
    
    void prime()
    {
        for(int i = 2; i < 10000; i++) {
            if(isPrime)
            {
                a[flag++] = i;
            }
        }
    }    
    

     提交的时候WA,后来发现它把4, 25这两个数也加在了素数表中

    正确打表模板

    #include<stdio.h>
    int n,i,j,a[1000001],p[100000],t=0;
    void main()
    {
        scanf("%d",&n);
        a[1]=0;
        for(i=2;i<=n;i++)a[i]=1;
        for(i=2;i<=n;i++)
            if(a[i]){
                p[t++]=i;//i即为被记录的素数
               for(j=i+i;j<=n;j+=i)a[j]=0;//素数的倍数都标记为零
            }
        for(i=0;i<t;i++)
            printf("%d%c",p[i],i<t-1?' ':'
    ');
    }
    

      

    埃氏筛法

    int prime[MAX_N];
    bool isPrime[MAX_N + 1];
    
    int sieve(int n) {
        int p = 0;
        for(int i = 0; i <= n; i++)
            isPrime[i] = true;
        isPrime[0] = isPrime[1] = false;
        for(int i = 2; i <= n; i++) {
            if(isPrime[i]) {
                prime[p++] = i;
                for(int j = 2 * i; j <= n; j += i) {
                    isPrime = false;
                }
            }
        }
        return p;
    }
    

      

    AC代码

    #include<stdio.h>
    #include<math.h>
    
    int a[5000];
    int flag = 0;
    
    int prime(int n)
    {
        int i,q;
        q=(int)sqrt(n);
        for(i=0; (a[i]<=q && flag); i++)
            if(n%a[i]==0)
                return 0;
        return 1;
    }
    
    int main()
    {
        int n;
    
        for(int i=2; i<=10000; i++)
            if(prime(i))
                a[flag++]=i;
    
        while(~scanf("%d", &n) && n != 0)
        {
            int flag2;
            int num = 0;
            for(int i = 0; i < flag; i++)
            {
                if(a[i] >= n)
                {
                    flag2 = i;
                }
            }
    
            //for(int i = 0; i < flag; i++)
              //  printf("%d ", a[i]);
    
            for(int i = flag2 - 1; i > 0; i--)
            {
                for(int j = 0; j < i; j++)
                {
                    if((a[i] + a[j]) == n)
                        num++;
                    else if((a[i] + a[j]) > n)
                        break;
                    else if((a[i] + a[j]) < n)
                        continue;
                }
    
            }
    
            printf("%d
    ", num);
        }
    
        return 0;
    }
    View Code
    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    复杂报表的存储过程
    Jquery中使用setInterval和setTimeout
    Jquery EasyUi实战教程布局篇
    枚举enum
    myGeneration代码生成器
    带有分页的存储过程
    应用临时表的存储过程
    缓存类的写法
    HDU4706 Children's Day
    HDU4706 Children's Day
  • 原文地址:https://www.cnblogs.com/h-hkai/p/8511610.html
Copyright © 2020-2023  润新知