题目链接:https://www.nowcoder.com/practice/04c8a5ea209d41798d23b59f053fa4d6?tpId=40&tqId=21334&tPage=1&rp=1&ru=/ta/kaoyan&qru=/ta/kaoyan/question-ranking
这道题的题目描述如下图所示
这是题目给的输入输出示例
看到这个题想到的最简单的办法就是下面这种:
package Tsinghua_002Yueshugeshu;
import java.util.*;
/**
* 求解约数个数
* @author sdu20
*
*/
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int len = in.nextInt();
int[] result = new int[len];
for(int i = 0;i<len;i++){
int number = in.nextInt();
int k = 0;
for(int j = 1;j<=number;j++){
if(number%j == 0)
k++;
}
result[i] = k;
}
for(int i = 0;i<len;i++)
System.out.println(result[i]);
}
}
但是提交的结果却是超时了
因而需要稍微地优化一下,根据一个数的因子一般是成对出现的特点,进行稍微地优化:
package Tsinghua_002Yueshugeshu_2ed;
import java.util.*;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int len = in.nextInt();
int[] result = new int[len];
for(int i = 0;i<len;i++){
int number = in.nextInt();
if(number==1){
result[i] = 1;
continue;
}
int k = 0;
for(int j = 1;j*j<=number;j++){
if(number%j == 0)
k+=2;
if(j*j==number)
k--;
}
result[i] = k;
}
for(int i = 0;i<len;i++)
System.out.println(result[i]);
}
}
这样就可以了
本文介绍了一种求解整数约数个数的问题,并通过优化原始算法避免了超时错误。初始方案采用简单遍历的方式,但在面对大量数据时效率低下。优化后的算法利用约数配对特性显著提高了计算速度。
633

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



