最多约数问题
正整数x的约数是能整除x的正整数。正整数x 的约数个数记为div(x)。例如,1,2,5,10 都是正整数10 的约数,且div(10)=4。设a 和b 是2 个正整数,a≤b,找出a和b之间约数个数最多的数x及其最多约数个数。
方法一算法思想:
1.输入a、b;
2.利用两个循环分别求在输入的a、b之间的数的约数:设置总约数起始值为2(1和本身),分别对1-i求余,余数为0则总约数加1,比较每个数的总约数大小
3.输出最大值
代码实现⬇
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,b,x=0,i,k;//输入ab
int n=2,m=1;//n:约数个数,m:最大约数个数
scanf("%d%d",&a,&b);//input
for(i=a;i<=b;i++){
n=2;
for(k=2;k<i;k++){
if(i%k==0) {n++;}
if(n>m) {m=n;x=i;}
}
}
printf("%d与%d之间约数个数最多的为:%d,约数为%d:",a,b,x,m);
return 0;
}
方法二算法思想:
一个合数的约数个数等于它每个质因数的个数+1再相乘。
例如 12=223
约数个数=(2+1)*(1+1)=6
1.输入ab
2.判断2-i/2(a<i<b)是不是素数(质因数必是素数),判断是不是约数,如果是,统计个数存入数组,按公式求出约数个数
3.比较a-b间约数个数最大的,输出
代码实现⬇
#include<stdio.h>
int sushu(int num)//判断这个数是不是质数
{
int flag = 1;
for(int i = 2;i < num / 2;i ++)
{
if(num % i == 0)
{
flag = 0;
break;
}
}
return flag;
}
int div(int num)
{
int count;
int *result = new int[num + 1];
int temp = num;
int total = 1;
for(int i = 0;i < num + 1;i ++){
result[i] = 0;
}//初始化
for(int i = 2;i <= num / 2;i ++)
{
if(sushu(i))//是素数
{
if(temp % i == 0)//是质因数
{
count = 0;
while(temp % i == 0)
{
count ++;//质因数个数
temp = temp / i;
}
result[i] = count;//存入数组
}
}
}
for(int i = 2;i <= num;i ++)
{
if(result[i] != 0)
total = total * (result[i] + 1);//公式求约数个数
}
return total;
}
int main()
{
int a,b;
int m = 0;
int temp;
int x;
scanf("%d%d",&a,&b);
for(int i = a;i <= b;i ++)
{
temp = div(i);//各个数约数个数
if(temp > m){
m = temp;
x=i;//求max
}
}
printf("%d与%d之间约数个数最多的为:%d,约数为%d:",a,b,x,m);
return 0;
}