面试题求1到100w中的完数

 一个数如果恰好等于除它本身外的因子之和,这个数就称为"完数",也叫“完美数”。例如6=1+2+3.(6的因子是1,2,3)


package com.zhao.test;

//不知性质做
public class WanShu {

//limit 在10000之内就ok
// 100000就用23秒
public void getResult(int limit)
{
long begin = System.currentTimeMillis();
for(int i=1;i<=limit;i++)
{
if(isWanShu(i))
System.out.println(i);
}
long end = System.currentTimeMillis();
long time = end-begin;
System.out.println("time is:"+time);
}

//是完数
public boolean isWanShu(int num)
{
//判断条件
if(num==getTotal(num))
return true;
return false;

}

//求所有积因子的和
public int getTotal(int num)
{
int sum = 0;
for(int i=1;i<=num/2;i++)
{
if(num%i==0)
sum +=i;
}
return sum;
}

public static void main(String[] args) {

WanShu wanshu = new WanShu();
wanshu.getResult(100000);

}

}




package com.zhao.test;

import java.util.ArrayList;

//知道性质做long类型用尽也不用时间
public class CountTest {

//是素数
public boolean isShuShu(long num)
{
for(long i=2;i<num;i++)
{
if(num%i==0)
return false;
}
return true;
}

//求完数,参数为一质数
//公式wanshu = 2^(n-1)*(2^n-1) n为质数
//质数的一性质 p为质数时,2^p-1为质数
public long getWanShu(long shushu)
{
long result = (long) (Math.pow(2, shushu-1)*(Math.pow(2, shushu-1)));
return result;
}

public void getResult(long limit)
{
long begin = System.currentTimeMillis();
long range = (long) Math.sqrt(limit);
for(long i=2;i<=range;i++)
{
long wanshu=0;
if(isShuShu(i))
{
wanshu=getWanShu(i);
if(wanshu<=limit)
{
System.out.println(wanshu);
}
else
{
break;
}
}
}

long end = System.currentTimeMillis();
long time = end-begin;
System.out.println("time is:"+time);
}

public static void main(String[] args) {

CountTest ct = new CountTest();
ct.getResult(1000000000000000000l);
}

}


面试题真的太无谓了,好像是在考数学题一般.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值