每天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
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值