這題是給定一個範圍的數字,假設是1到100,要找出哪一個數字有最多的除數。
這題就相當於做質因數分解,假設有個數字N = 2^2 X 3^2 X 7,那它的除數個數就相當於(2+1)*(2+1)(1+1)。
首先是質數篩,一個合數N必定有小於等於sqrt(N)的質因數,所以我們要先算出小於等於N以下的質數有幾個。
bool is_prime[31631];
unsigned long long prime[16000];
int main(int argc, char const* argv[])
{
int m = 0;
for(int i = 2;i <= 31630;i++){
if(!is_prime[i]){
prime[m++] = i;
for(int j = i*i;j <= 31630;j = j+i){
is_prime[j] = true;
}
}
}
unsigned long long l,u;
int pp;
while(~scanf("%d ",&pp)){
while(pp--){
scanf("%llu %llu",&l,&u);
int max = 0;
unsigned long long ans_i;
for(unsigned long long i = l;i <= u;i++){
unsigned long long tmp = i;
int ans = 1;
for(int j = 0;prime[j]*prime[j]<= tmp && j<m;j++) {
if(tmp%prime[j] == 0){
int count = 0;
while(tmp%prime[j] == 0){
tmp = tmp/prime[j];
count++;
}
ans = ans*(count+1);
}
}
//表示還有一個質因數
//比如說2^2X3^2X7,7會被留下來
if(tmp>1){
ans = ans*2;
}
if(ans>max){
max = ans;
ans_i = i;
}
}
printf("Between %llu and %llu, %llu has a maximum of %d divisors.\n",l,u,ans_i,max);
}
}
return 0;
}