【算法】最多约数问题/两种方法

最多约数问题
正整数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;
}
  • 10
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值