题意:给一个区间,求该区间内哪个整数的约数最多,约数有多少个。如果多个数满足,输出最小的那个数。
思路:枚举区间内每一个数,分解质因数,将每个质数的指数+1乘起来,找最小值。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <memory.h>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <ctype.h>
#include<time.h>
#define INF 1000000
using namespace std;
bool vis[31700];
long long primes[3500];
int main(){
memset(vis,0,sizeof(vis));
vis[0]=vis[1]=true;
for(int i=2;i<=180;i++){
for(int j=i*i;j<31700;j+=i){
vis[j]=true;
}
}
int cnt=0;
for(int i=1;i<31700;i++){
if(!vis[i])primes[++cnt]=i;
}
int t;
cin>>t;
long long L,U;
while(t--){
cin>>L>>U;
int ans=0;
long long k;
for(long long j=L;j<=U;j++){
long long a=j;
int tmp=1;
for(int i=1;i<=cnt;i++){
int time=0;
while(!(a%primes[i])){
a/=primes[i];
time++;
}
if(time){
tmp*=(time+1);
}
}
if(tmp>ans){
k=j;
ans=tmp;
}
}
printf("Between %lld and %lld, %lld has a maximum of %d divisors.\n",L,U,k,ans);
}
return 0;
}
本文介绍了一种算法,用于找出指定区间内拥有最多约数的整数及其约数的数量。若存在多个这样的数,则输出其中最小的一个。通过分解质因数的方法来计算每个数的约数个数。

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



