Java相亲数

<pre name="code" class="java">package char3;

/**************************
 * 解决相亲数问题 
 *************************/
public class AmicableNumbers {
	
	private static int[][] amicableNumbers = new int[10000][2]; //存储相亲数的二维数组
	private static int amicableNumbersCount = 0;			  //统计相亲数数目
	public static void main(String[] args) {
		
		long startTime = System.currentTimeMillis();
		GetAmicableNumbers();
		PrintAmicableNumbers();
		long endTime = System.currentTimeMillis();
		System.out.println("程序经历时间:"+(endTime - startTime) + "ms");
	}
	
	
	/****************************
	 *函数功能:获取相亲数
	 *函数参数:整形参数elem
	 *函数返回值:elem真因数之和
	 ****************************/ 
	private static void GetAmicableNumbers(){
		
		for(int num = 3; num <= 100000; ++num){
			int sumProperFactor = 0; 	//---真因数之和---//
			sumProperFactor = GetProperFactor(num);
			
			if(sumProperFactor > num && num == GetProperFactor(sumProperFactor)){ //---避免相等重复---//
				
					amicableNumbers[amicableNumbersCount][0] = num;
					amicableNumbers[amicableNumbersCount][1] = sumProperFactor;
					amicableNumbersCount++;
			}
		}
	}
	/****************************
	 *函数功能:获取参数elem的真因数之和
	 *函数参数:整形参数elem
	 *函数返回值:elem真因数之和
	 ****************************/ 
	private static int GetProperFactor(int elem){
		int total = 1;
		
		/*一开始我采用的是i<= elem / 2 , 运行时间基本上在53000ms,将近一分钟,线性复杂度;但是我采用了这种限制方法之后,复杂度为Q(n二分之一次方,100000条数据基本上在400ms之内)*/
		for(int i = 2; i <= (int)Math.sqrt(elem); ++i){ 
			if(elem % i == 0){
				total += i + elem / i;
			}
		}
		return total;
	}

	/****************************
	 *函数功能:打印相亲数
	 ****************************/
	private static void PrintAmicableNumbers(){
		for(int i = 0; i < amicableNumbersCount; i++)
		{
			System.out.println("第"+i+"组相亲数");
			System.out.printf("%5d和%5d是一对相亲数", amicableNumbers[i][0],amicableNumbers[i][1]);
			System.out.println("\n-------------------------------------\n");
		}
	}
}





                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值