获取一个数的所有因子并判断完数

一般在编程中,因子指因数。 因数:假如a÷b=c(a、b、c都是整数),那么我们称b和c就是a的因数。需要注意的是,唯有被除数,除数,商皆为整数,余数为零时,此关系才成立,对于一个整数来说,它本身并不是因子。获取一个数所有因子的一般性方法是用n对1~n之间的数进行取余运算判断余数是否为零(n%m==0),余数为零则记录m,此方法的时间复杂度为O(n),当n<100000时程序效率符合要求,但当n>100000之后程序效率明显下降,时常还会发生堆栈溢出,这时就需要一个效率更高的算法来解决问题了,对于一个数来说,它的因子只可能出现在1~n/2之间,并且在在它的平方根左右实现一一对应,例如:20=1*20、20=2*10、20=4*5,如此一来我们只需要将其平方根左侧的因子取得便可取得全部因子!

一、使用for循环进行遍历

//程序的准备与调用
int n = 200000000;
if(n==output(n)){
	System.out.println("="+n);		
	System.out.println("Yes");
}else{
	System.out.println("="+n);		
	System.out.println("No");
}
public int output(int n){
	int count = 0;
	if(n == 0||n == 1)
		return count;
		else if(n == 2){
			System.out.println("1");
			return ++count;
		}else{
			System.out.print(1+"+");
			int l = (int) Math.sqrt(n);
			for(int i = 2; i <= l; i++){
				if(n % i == 0){
				if(i==n/i){
					System.out.print(i+"+");
					count = count + i;
				}else{
					System.out.print(i+"+");
					System.out.print(n/i+"+");
					count = count+i+n/i;
				}					
			}
		}
	}
	return count+1;		
}

二、递归 方法一

//程序的准备与调用
int n = 2000000000;
output(n,1,n);
	if(n==sum){					
		System.out.println("1="+n);		
		System.out.println("Yes");
	}else{				
		System.out.println("1!="+n);	
		System.out.println("No");
	}
public void output(int n,int m,int o){
	m++;
	if(!(m>=o)){
		if(n%m==0){
			output(n,m,n/m);
			if(m==n/m){
				System.out.print(m+"+");
				sum = sum + m;
			}else{
				System.out.print(m+"+"+n/m+"+");
				sum = sum + m + n/m;
			}				
		}else{output(n,m,--o);}	
	}
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值