#5248: 執行無法通過TLE,請撥冗協助 一下


ray57diary79 (無)

學校 : 不指定學校
編號 : 18790
來源 : [114.32.244.119]
最後登入時間 :
2011-07-09 06:24:19
a121. 質數又來囉 | From: [114.32.242.12] | 發表日期 : 2011-06-28 18:59

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

#define MAX 1000000

int main(void)
{
    int i,j,a,b,cnt,gap,prime,is_prime,len=0;
    int arr[MAX];
   
    arr[len++]=2; arr[len++]=3; arr[len++]=5;   //取6的倍數 6k+1,6k+5
    gap=2; prime=7;
   
    while(scanf("%d %d",&a,&b)==2) {
      if(a==1) a++;
     
      for(i=0;i<len && arr[i]<a;i++) ;
      for(cnt=0;i<len && arr[i]>=a && arr[i]<=b;++cnt,i++) ;
     
      for(;prime<=b;prime+=gap) {
        for(is_prime=1,j=2;arr[j]<=(int)sqrt(prime) && is_prime;j++)
           if(prime%arr[j]==0)
              is_prime=0;                       
       
       
        if(is_prime) {
          arr[len++]=prime;
          ++cnt;            
        }
              
        gap=6-gap;                                          
      }                 
     
      for(;i<len && arr[i]<a;--cnt,i++) ;
      printf("%d\n",cnt);                        
    }                
   
   
    return 0;
}

 
#5257: Re:執行無法通過TLE,請撥冗協助 一下


abcd6891 (曄哥)

學校 : 國立花蓮高級中學
編號 : 3565
來源 : [61.231.222.61]
最後登入時間 :
2024-09-16 11:43:21
a121. 質數又來囉 | From: [114.37.247.229] | 發表日期 : 2011-06-30 16:13

#include
#include

#define MAX 1000000

int main(void)
{
    int i,j,a,b,cnt,gap,prime,is_prime,len=0;
    int arr[MAX];
   
    arr[len++]=2; arr[len++]=3; arr[len++]=5;   //取6的倍數 6k+1,6k+5
    gap=2; prime=7;
   
    while(scanf("%d %d",&a,&b)==2) {
      if(a==1) a++;
     
      for(i=0;i      for(cnt=0;i=a && arr[i]<=b;++cnt,i++) ;
     
      for(;prime<=b;prime+=gap) {
        for(is_prime=1,j=2;arr[j]<=(int)sqrt(prime) && is_prime;j++)
           if(prime%arr[j]==0)
              is_prime=0;                       
       
       
        if(is_prime) {
          arr[len++]=prime;
          ++cnt;            
        }
              
        gap=6-gap;                                          
      }                 
     
      for(;i      printf("%d\n",cnt);                        
    }                
   
   
    return 0;
}

這樣寫太難讓人看懂了!!
 
#5259: Re:執行無法通過TLE,請撥冗協助 一下


david942j (文旋)

學校 : 臺北市立成功高級中學
編號 : 6086
來源 : [115.43.75.16]
最後登入時間 :
2017-02-18 13:17:39
a121. 質數又來囉 | From: [111.185.69.221] | 發表日期 : 2011-06-30 18:03

#include
#include

#define MAX 1000000

int main(void)
{
    int i,j,a,b,cnt,gap,prime,is_prime,len=0;
    int arr[MAX];
   
    arr[len++]=2; arr[len++]=3; arr[len++]=5;   //取6的倍數 6k+1,6k+5
    gap=2; prime=7;
   
    while(scanf("%d %d",&a,&b)==2) {
      if(a==1) a++;
     
      for(i=0;i      for(cnt=0;i=a && arr[i]<=b;++cnt,i++) ;
     
      for(;prime<=b;prime+=gap) {
        for(is_prime=1,j=2;arr[j]<=(int)sqrt(prime) && is_prime;j++)
           if(prime%arr[j]==0)
              is_prime=0;                       
       
       
        if(is_prime) {
          arr[len++]=prime;
          ++cnt;            
        }
              
        gap=6-gap;                                          
      }                 
     
      for(;i      printf("%d\n",cnt);                        
    }                
   
   
    return 0;
}

這樣寫太難讓人看懂了!!


預先建質數表

不然每詢問一次a,b都要重新建質數表

這樣太久了

 
#5271: Re:執行無法通過TLE,請撥冗協助 一下


ray57diary79 (無)

學校 : 不指定學校
編號 : 18790
來源 : [114.32.244.119]
最後登入時間 :
2011-07-09 06:24:19
a121. 質數又來囉 | From: [114.32.233.111] | 發表日期 : 2011-07-02 06:41

這樣寫太難讓人看懂了!!


預先建質數表

不然每詢問一次a,b都要重新建質數表

這樣太久了

prime這個變數儲存目前執行所得的最大質數,若測資要求的範圍小,則進不了尋找的迴圈,若超過prime目前值,則進行尋找的動作,應該有排除一些不必要的每個測資都從頭執行尋找的動作,不至於執行過時吧!
 
ZeroJudge Forum