2009-07-30 19:01:19來源不明

ACM 294 Q294: Divisors

作法:建出質數表做因數分解

例如:40=2^3 * 5 個數就是 (3+1)*2=8

/**********************************************************/

#include<stdio.h>  
#include<stdlib.h>  
#include<math.h>  
int Prime[5200]={0},p;  
int prime()  
{  
  char num[100000]={0};  
  int a,b,m=0;  
 for(a=2;a<50000;a++)     
      if(num[a]==0)     
        {     
           Prime[m]=a;     
           m++;     
           for(b=2;a*b<=50000;b++)     
             num[a*b]=1;     
        }  
   return m;  
}  
int Divisors (int num)
{
   int a,b,C=1,m=(int)sqrt(num);
   for(a=0;a<p&&Prime[a]<=m&&num!=1;a++)
      {
        int time=0;
        if(num%Prime[a]==0)
          {
             while(num%Prime[a]==0)
                {
                   num/=Prime[a];
                   time++;
                }
             C*=(time+1);
          }
      }
    if(num!=1)
      C*=2;
    return C;
}
main()  
{  
 p=prime(); 
 int t,n,m,a;
 while(scanf("%d",&t)==1)
   while(t--)
    {
       scanf("%d %d",&n,&m);
       int maxn,max=0;
       for(a=n;a<=m;a++)
         {
          int time=Divisors (a);
          if(time>max) {max=time;maxn=a;}
         }
       printf("Between %d and %d, %d has a maximum of %d divisors.\n",n,m,maxn,max);
    }
 return 0;     
}
  

MON 2011-03-17 00:52:51

還是說 其實只要求到n^(1/2)的質數就好了?
因為必有小於根號N的因數 否則必為質數?

MON 2011-03-17 00:20:36

for(b=2;a*b<=50000;b++)

但是題目是說U<=1000000000


要求到這麼大的質數表 還是可以這樣做嗎?

B88000005 2009-09-12 15:07:36

for(a=0;a<p&〃[a]<=m&&num!=1;a++)
這行是什麼XD看無?

版主回應
for(a=0;a<p & & Prime[a] < = m && num!=1 ; a++)
您的瀏覽器不支援哦
2009-09-12 19:27:13