最多约数问题。正整数x 的约数是能整除x的正整数,其约数的个数记为div(x),例如div(10)=4。设a 和b 是两个正整数,找出a 和b 之间约数个数最多的数x 的约数个数。
样例输入:
136
样例输出:
9
解法1:暴力循环,依次记录区间范围之内每个数的约数个数进行比较。
#include<stdio.h>
#include<math.h>
int main()
{
int a,b;
int i,j,k;
int max,count;
while(~scanf("%d%d",&a,&b)){
max=0; //最终最大的约数个数
count; //存放每个数的约数个数
int temp=0;//约数最多的数
for(i=a;i<=b;i++){
k=i;
count=0;
for(j=1;j<=i;j++)
{
if (i%j==0)
{
count ++;
}
}
if(count>max){
max=count;
temp=i;
}
}
printf("%d\n",max);
printf("%d\n",temp);
}
return 0;
}
#include<stdio.h>
#include<map>
#include<string.h>
int m[10000];
//对合数n进行质因数分解
//将每个质因数放在数组中
//判断每个质因数出现的次数
int solove(int n)
{
int temp=n;
memset(m,0,sizeof(m));
int count=1;
int i;
for(i=2;i<=n/2;i++)
{
if(n%i==0){
m[i]++;//统计质因数出现的次数
n=n/i;//排除已知的质因数继续求解
i--;//还原i值
}
}
if(n>1){
m[n]++;
}
//根据每个质因数出现的数量求得n的约数个数
for(int j=1;j<=temp;j++)
{
if(m[j]>0){
count*=(m[j]+1);
}
}
return count;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{ int max=0;
for(int i=n;i<=m;i++){
if(max<solove(i))
{
max=solove(i);
}
}
printf("%d\n",max);
} return 0;
}