1. 程式人生 > >最多約數問題

最多約數問題

問題

  • 最多約數問題:正整數x的約數是能整除x的正整數。正整數x 的約數個數記為div(x)。例如,1,2,5,10 都是正整數10 的約數,且div(10)=4。設a 和b 是2 個正整數,a≤b,找出a和b之間約數個數最多的數x及其最多約數個數。

方法

  • 列舉法:列舉區間(a, b)內的所有整數,統計他們的約數個數,找出約數最多的整數。
  • 質因子法:取出區間(a,b)內的所有整數,判斷是否能被以此增長的素數整除,若能被整除則該素數進行指數增長判斷是否能被整除直至素數的指數倍大於該整數,記錄指數大小,若此時已得到該整數,則利用公式正整數x的質因子分解為:x=p1^N1 × p2^N2 ×……pi^Ni,則div(x)=(N1+1)(N2+1)……(Ni+1)求得約數個數,否則繼續驗證素數。

程式碼

  • 列舉法
#include <stdio.h>
#include <stdlib.h> 
int main()
{      
  int i=1,j=0,k=1,a,b,max=0,m=0,count[100]={0};   	  
  scanf("%d %d",&a,&b);    
  for(;i<b-a;i++)//迴圈依次找出在(a,b)區間的整數   
  {  
     for(j=0,k=1;k<=a+i;k++)//從一開始遍歷	
     {   
         if((a+i)%k==0)                
         j++;}//若k能整除此整數,則約數個數加一        
     count[i]=j;        
     if(j>=max) //找出最多約數個數        
     {  
        max=j;            
        m=i;} //將當前有最大約數個數的整數賦給m    
  }    
  for(i=0;i<b-a;i++)     
  {        
     if(count[i]==max)             
     printf("%d %d\n",a+i,max);    
  }
 }
  • 質因子法
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{    
   int i=1,m=1,s=1,a,b,t=0,j=0,k=0,max=0,c[100]={0};    
   scanf("%d %d",&a,&b);    
   for(;i<b-a;i++)//迴圈依次找出在(a,b)區間的整數    
   {        
       t=a+i;        
       for(j=2;j<=t;j++)//列舉不大於該整數的所有素數       
       {            
           if(t%j==0)//若t能被j整除            
           {                
               for(k=2;pow(j,k)<=t;k++)                
               {                    
                   if(t%(int)(pow(j,k))==0)//判斷j的k次方是否能整除t                        
                   s=k;//將最大k值賦給s                
               }                
               m=m*(s+1);//利用公式求得當前約數個數               
               if(t==pow(j,s))                    
                   break;//若j的s次方等於t,跳出迴圈,判斷下一個整數               
               else                    
                   t=t/pow(j,s);//若j的s次方不等於t,將t賦予新值                
               s=1;            
           }       
       }        
       c[i]=m;//將得到的約數個數m賦給c[i]        
       m=1;//將m置1        
       if(c[i]>=max)            
            max=c[i];//得到最大約數個數    
   }    
   for(i=1;i<b-a;i++)   
   {       
      if(c[i]==max)             
      printf("%d %d\n",a+i,max);
   }
}