约数的个数——清华大学机试真题

本文介绍了一种求解整数约数个数的问题,并通过优化原始算法避免了超时错误。初始方案采用简单遍历的方式,但在面对大量数据时效率低下。优化后的算法利用约数配对特性显著提高了计算速度。

题目链接: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]);
	}

}

这样就可以了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值