一般在编程中,因子指因数。 因数:假如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);}
}
}