• 每天OnlineJudge之 “数素数”


    Problem
    素数是的只能被1和它本身整除的自然数。判断一个数是素数的方法是使用2到该数的平方根的素数除它,若有能整除的则该数不是素数。

    Input
    本题有多组数据,每组数据由两个正整数M,N组成。(0<M<N<1000000)

    Output
    输出一个整数,表示介于M,N之间(包括M,N)的素数的数量。

    Sample Input
    5 10
    1 3
    6 8

    Sample Output
    2
    2
    1

    ---------------------------
    第一次尝试,不合乎要求的代码

    /*
    此解答未Accepted
    原因:内存使用超出限制
    Memory Limit Exceeded 4100k 25ms C++ 2006-05-07 22:56:07 
    */


    #include
    <stdio.h>
    #include
    <math.h>
    #include
    <malloc.h>

    int* arrIs;
    int count=0;
    int start=0;
    int end=0;

    int Is(int n)
    {
        
    if(arrIs[n] != -1)
        
    {
            
    return arrIs[n];
        }


        
    if(n>3)
        
    {
            
    for(int i=2; i<=sqrt(n); i++)
            
    {
                
    if( Is(i) && n%i==0 )
                
    {
                    arrIs[n] 
    = 0;
                    
    return 0;
                }

            
            }

        }


        arrIs[n]
    =1;
        
    return 1;
    }


    int main()
    {

        
    while(scanf("%d",&start)!=EOF && scanf("%d",&end)!=EOF)
        
    {
            count 
    =0;

            arrIs 
    = (int*)malloc((end+1)*4);

            
    for(int i=0; i<=end; i++)
            
    {
                arrIs[i] 
    = -1;
            }


            
    for(int j=start; j<=end; j++)
            
    {
                
    if(Is(j))
                    count
    ++;
            }


            printf(
    "%d",count);
            
        }


        
    return 0;
    }






    --------------------------------------------------------------


    第二次尝试,用时间换空间,但仍是不合乎要求的

    /*
    此解答未Accepted
    原因:时间使用超出限制
     
     Result              Memory Time   Language Date  
     Time Limit Exceeded 192k   2000ms C++      006-05-08 18:11:05 
     
    */



    #include
    <stdio.h>
    #include
    <math.h>
    #include
    <malloc.h>


    typedef 
    struct node_
    {
        
    int num;
        node_ 
    * next;
    }
    node;


    node
    * nodesHead;
    int count=0;
    int start=0;
    int end=0;


    int Is(int);
    int Find(int);



    int Is(int n)
    {
        
    if(Find(n))
        
    {
            
    return 1;
        }

        
    if(n>3)
        
    {
            
    for(int i=2; i<=sqrt(n); i++)
            
    {
                
    if( Is(i) && n%i==0 )
                
    {
                    
    return 0;
                }

            
            }

        }
    else if(n<=1)
        
    {
            
    return 0;
        }


        node 
    * nd = (node*)malloc(sizeof(node));
        nd
    ->num = n;
        nd
    ->next = nodesHead->next;
        nodesHead
    ->next = nd;

        
    return 1;
    }



    int Find(int n)
    {
        node
    * h = nodesHead;
        
    while(h->next)
        
    {
            
    if(h->num == n)
            
    {
                
    return 1;
            }

            h
    =h->next;
        }

        

        
    return 0;
    }



    int main()
    {
        nodesHead 
    = (node*)malloc(sizeof(node));
        nodesHead
    ->num=2;
        nodesHead
    ->next=0;
        
    while(scanf("%d",&start)!=EOF && scanf("%d",&end)!=EOF)
        
    {
            count 
    =0;

            
    for(int j=start; j<=end; j++)
            
    {
                
    if(Is(j))
                    count
    ++;
            }


            printf(
    "%d\n",count);
            
        }



        
    return 0;
    }


    最终的解答,正确的

    #include<iostream> 
    #include
    <cmath> 
    using namespace std;
    int isprime(int); 

    int main()
    {
        
    int m,n;int i,j;int number=0int primenum=0
        
    int a[170]; 
        
    for(i=2;i<=1000;i++)
        

            
    if(isprime(i))
                a[primenum
    ++]=i;
        }
    //先作1--1000素数表 
       
        
    while(scanf("%d %d",&n,&m)!=EOF)
        
    {
             
    for(i=n;i<=m;i++)//i从n测试到m 
             {  
                 
    if(i==1)
                 
    {
                     
    continue;
                 }


                 
    for(j=0;j<primenum;j++
                 
    {
                     
    if(i==a[j])
                     
    {
                         number
    ++;
                         
    break;
                     }
      
                    
                     
    if(i%a[j]==0)
                     
    {
                         
    break;
                     }


                     
    if(j==(primenum-1))
                     
    {
                         number
    ++
                     }

                 }

             }

            cout
    <<number<<endl;
            number
    =0;   
        }
     

        
    return 0
    }
     
    int isprime(int n)
    {
        
    int i;

        
    for(i=2;i<=pow(n,0.5);i++)
        
    {
          
    if(n%i==0)
              
    return 0;
        }


        
    return 1
    }



     

  • 相关阅读:
    Arrays类
    spring boot 整合ehcache
    自定义注解
    图像技术经典会议
    机器学习常见优化器
    TensorFlow学习笔记(一)
    Linux 下 jupyter安装
    学生、课程、分数关系的设计与实现 Hibernate
    Hibernate连接三种数据库的配置(SQL Server、Oracle、MySQL)
    Oracle11g服务详细介绍及哪些服务是必须开启的?
  • 原文地址:https://www.cnblogs.com/zhouyinhui/p/397099.html
Copyright © 2020-2023  润新知