题目分析:正整数 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);
}
这篇博客介绍了两种算法来寻找两个正整数之间约数个数最多的数。首先,暴力法通过双重循环遍历每个数的约数,计算并存储每个数的约数个数。然后,对存储的约数个数进行排序,输出最大的值。其次,质因子分解法利用质因数分解优化,计算每个数的质因子及其个数,通过公式计算约数个数,并找到最大值。这种方法更高效,尤其对于大整数范围更优。
2705

被折叠的 条评论
为什么被折叠?



