问题提出
正整数 x的约数是能整除x的正整数,其约数的个数记为div(x),例如div(10)=4。
设 a 和 b 是两个正整数,找出 a 和 b 之间约数个数最多的数 x的约数个数。
问题分析
解法1
将整数分解为质数相乘,例如10=2^1*5^1,则约数个数为(1+1)*(1+1)=4;36=2^2+3^2,约数个数为(2+1)*(2+1)=9。通过求解质数的个数,来求约数的个数,节省时间。
#include<stdio.h>
int prime(int m){
for(int k=2;k<m;k++){
if(m%k==0){
return 0;
}
}
return 1;
}
int main(){
int a,b;
scanf("%d%d",&a,&b);
int i,j;
int result;
int count;
int max=0,temp;
for(i=a;i<=b;i++){
result=1;
for(j=2;j<=i;j++){
count=0;
temp=i;
if(prime(j)){
while(temp){
if(temp%j==0){
count++;
temp/=j;
}
else{
break;
}
}
result*=(1+count);
}
}
if(result>max)
{
max=result;
}
}
printf("%d\n",max);
return 0;
}
解法2
#include<stdio.h>
#include<math.h>
int div(int m){
int n=2;
if(m%2==0){
n=2;
for(int j=2;j<=m/2;j++){
if(m%j==0){
if(j==m/j){
n++;
}else if(j<m/j){
n+=2;
}else{
break;
}
}
}
}
return n;
}
int main(){
int a,b;
int max=0;
scanf("%d %d",&a,&b);
for(int i=a;i<=b;i++){
if(div(i)>=max){
max=div(i);
}
}
printf("%d",max);
return 0;
}