最多约数问题

这篇博客介绍了两种算法来寻找两个正整数之间约数个数最多的数。首先,暴力法通过双重循环遍历每个数的约数,计算并存储每个数的约数个数。然后,对存储的约数个数进行排序,输出最大的值。其次,质因子分解法利用质因数分解优化,计算每个数的质因子及其个数,通过公式计算约数个数,并找到最大值。这种方法更高效,尤其对于大整数范围更优。
部署运行你感兴趣的模型镜像

题目分析:正整数 x的约数是能整除x的正整数,其约数的个数记为div(x),例如div(10)=4。
设 a 和 b 是两个正整数,找出 a 和 b 之间约数个数最多的数 x的约数个数。

暴力法


#include<stdio.h>
#include<algorithm>
using namespace std;
int main() {
	int a, b;  //输入的区间
	int c[1000] = {0};		//用数组存储div(x)
	scanf("%d %d", &a, &b);
	for (int i = a; i <=b; i++) {		//遍历求解a-b之间的每一个div(x)
		for (int j = 1; j <= i; j++) {
			if (i % j == 0) {
				c[i]++;
			}
		}
	}
	sort(c + a, c + b);					//将div数组从小到大排序
	printf("%d", c[b]);					//输出最大div(x)---c[b]
}

质因子分解法

#include<stdio.h>
#include<math.h>
struct factor {
	int x, cnt;//质因子,个数
}fac[10];
const int maxn = 1000001;
bool p[maxn] = {0};
int prime[maxn];
int pnum = 0;
void creat_prime() {
	for (int i = 2; i < maxn; i++) {
		if (p[i] == false) {
			prime[pnum++] = i;
			for (int j = i + i; j < maxn; j += i) {
				p[j] = true;
			}
		}
	}
}
int prime_num(int n) {
	int num=0;
	if (n == 1) return 1;
	else {
		int sqt = sqrt(n);
		for (int i = 0; i < pnum && prime[i] <= sqt; i++) {
			if (n % prime[i] == 0) {
				fac[num].x = prime[i];
				fac[num].cnt = 0;
				while (n % prime[i] == 0) {
					fac[num].cnt++;
					n /= prime[i];
				}
				num++;
			}
			if (n == 1)break;
		}
		if (n != 1) {
			fac[num].x = n;
			fac[num++].cnt = 1;
		}
	}
	int count = 1;
	for (int i = 0; i < num; i++) {

		count *= (fac[i].cnt + 1);
	}
	return count;
}
int main() {
	creat_prime();
	int m, n, max;
	scanf("%d %d", &m, &n);
	max = prime_num(m);
	for (int i = m; i <= n; i++) {
		if (prime_num(i) > max) {
			max = prime_num(i);
		}
	}
	printf("%d", max);
}

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EQ淡写青春

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值