原题链接:最多约数问题
第一种方法:
遍历1到sqrt(num),如果num能被循环的i整除,则当前数为num的约数,其背面num/i也为num的约数
当num为一个平方数时,i会计入两次,所以添加一个a/i!=i来判段
import java.util.HashSet;
import java.util.Set;
public class Main{
static Set set=new HashSet<>();
public static void main(String[] args) {
//这里举例求2000的约数
int a=2000;
//遍历1到sqrt(2000)
for(int i=1;i*i<=a;i++) {
if(a%i==0) {
//加入集合
set.add(i);
//判段是否为i*i=num,排掉重复
if(a/i!=i) {
set.add(a/i);
}
}
}
//输出约数
for(int i:set) {
System.out.println(i);
}
System.out.println();
//输出约数个数
System.out.println(set.size());
}
}第二种方法:
其实第二种方法我用的还比较多,从蓝桥杯20年国赛第三题用的就是这种方法好算一些,但是这个方法好像在这道题时间会溢出,麻了。
第一步:欧拉筛选质数
第二部:判段传入num是否为质数,如果为质数,则直接返回2,如果不是则遍历2到num-1,把num的所有质数个数找出来,比如20可以分成2个2和一个5;选2有3种情况,选一个2\两个2或者不选,5也可以分为0或者1,组合出来的结果就是(2+1)*(1+1)=6。此题也是如此,找到一个数的所有质数个数,把每个质数个数+1全部乘起来就是ans。
第三部,遍历a到b,找出div返回值最大的;
import java.io.*;
public class Main{
static BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
static PrintWriter pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
static boolean[] isPrime;
static int a,b;
public static void main(String[] args) throws IOException {
String[] temp=bf.readLine().split(" ");
int a=Integer.parseInt(temp[0]);
int b=Integer.parseInt(temp[1]);
//欧拉筛
isPrime=new boolean[b+1];
isPrime[0]=isPrime[1]=true;
for(int i=2;i*i<=b;i++) {
if(!isPrime[i]) {
for(int j=2*i;j<=b;j+=i) {
isPrime[j]=true;
}
}
}
long max=0;
for(int i=a;i<=b;i++){
max=Math.max(max,div(i));
}
pw.print(max);
pw.flush();
}
public static long div(int num) {
long ans=1;
int[] arr=new int[num];
//判段是否为质数
if(!isPrime[num]) {
return 2;
}else {
//存储当前变量,避免被下面运算修改
int temp=num;
//循环2至num-1,如果为质数就arr[i]++
for(int i=2;i<num;i++) {
if(!isPrime[i]) {
while(temp%i==0) {
temp/=i;
arr[i]++;
}
}
}
//组合
for(int i=1;i<num;i++) {
if(arr[i]!=0) {
ans*=(arr[i]+1);
}
}
}
return ans;
}
}第三种方法:
这个其实是很容易的方法,但也是过这题的方法。
有点像欧拉筛,也是一个很好的方法,遍历1到b,把它的倍数存到相应的数组中去,这样就可以得到每个数的约数了。循环a-b,获得最大数
import java.io.*;
public class Main{
static BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
static PrintWriter pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
public static void main(String[] args) throws IOException {
//读取
String[] temp=bf.readLine().split(" ");
int a=Integer.parseInt(temp[0]);
int b=Integer.parseInt(temp[1]);
int[] arr=new int[b+1];
//遍历1到b,把他的倍数++
for(int i=1;i<=b;i++) {
for(int j=i;j<=b;j+=i) {
arr[j]++;
}
}
int max=0;
for(int i=a;i<=b;i++) {
max=Math.max(arr[i],max);
}
pw.print(max);
pw.flush();
}
}0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复