您的位置:首页 > 其它

如何判断一个数时幂数?

2006-08-24 17:46 120 查看
这个来自于csdn的一篇文章,我总结了下,就写了这个java程序




public class PowerExponent ...{




int currentGreatestCommonDivisor = 0;//记录计算时当前质因子个数 之间的最大的公约数初始化为0表示不可用


int currentPrimerDivisorCount =0 ; //用于记录当前质因素 个数计数


int prePrimerDivisorCount =0;//前一个质因数计数个数


int currentPrimerDivisor =0; //先前质因子


public void setCurrentGreatestCommonDivisor(int value)




...{


this.currentGreatestCommonDivisor = value;


}


public int getCurrentGreatestCommonDivisor()




...{


return this.currentGreatestCommonDivisor ;


}


public boolean isPowerExponentNumber(final int orignNumber)




...{


int number =orignNumber;


prePrimerDivisorCount =0;


currentPrimerDivisor =0;


currentGreatestCommonDivisor = 0;//初始化为0表示不可用


currentPrimerDivisorCount = 0;


if(number>3)




...{




currentPrimerDivisor = 2;


while(number%2 == 0)




...{


number /= 2;


++currentPrimerDivisorCount;


}


int i = 3;


while(number >=i )




...{


while(number%i == 0)




...{


if(i == currentPrimerDivisor)




...{


++currentPrimerDivisorCount;


}


else




...{


//新的质因素开始,计数个数设置为1 ,统计前一个质数的个数,记录当前质因子


prePrimerDivisorCount = currentPrimerDivisorCount;


currentPrimerDivisor = i;


currentPrimerDivisorCount = 1;




//判断最大公约数


if(currentGreatestCommonDivisor != 0)




...{


//如果最大公约数!=0表明一定不是第一次求最大公约数


currentGreatestCommonDivisor = PowerExponent.FindGreatestCommonDivisor(currentGreatestCommonDivisor,prePrimerDivisorCount);


if(currentGreatestCommonDivisor == 1)




...{


return false;


}


}


else




...{


currentGreatestCommonDivisor = prePrimerDivisorCount;


if(currentGreatestCommonDivisor == 1)




...{


return false;


}


}


}


number /=i;


}


if(i*i >orignNumber)




...{


//存在一个比它开方还大的质因子所以必非幂数


return false;


}


i+=2;


}




//质因素分解结束 number == 1


if(currentGreatestCommonDivisor == 0 && currentPrimerDivisorCount >1 )




...{


//只有一个质因子


return true;


}


else




...{


//求所有质因子个数的 最大公约数


currentGreatestCommonDivisor = PowerExponent.FindGreatestCommonDivisor(currentGreatestCommonDivisor,currentPrimerDivisorCount);


if(currentGreatestCommonDivisor == 1)




...{


return false;


}


else return true;


}


}


return false;


}




/** *//**


*


* @param a a>0


* @param b b>0


* @return 最大质因素


*/


public static int FindGreatestCommonDivisor(final int orignNumber_a,final int orignNumber_b)




...{


int a= orignNumber_a;


int b= orignNumber_b;


if(a==1 || b== 1) return 1;//互质




if( a%b == 0 )




...{


return b;


}


if(b%a == 0)




...{


return a;


}


int product =1 ;


int greatesCommonDivisor = 1;




while(a%2 == 0&& b%2 ==0)




...{


a /= 2;


b /=2;


product *=2;


}


int i = 3;


while(a>=i&&b>=i)




...{


while(a%i == 0 && b%i ==0)




...{


a /= i;


b /= i;


product *=i;


}


if(i * i > orignNumber_a || i*i > orignNumber_b)




...{


//当前的a ,b存在一个比它开方还大的质因子所以没有必要再分解质因子


greatesCommonDivisor = product;


return greatesCommonDivisor;


}


i += 2;


}


greatesCommonDivisor = product;


return greatesCommonDivisor;


}




public static void main(String[] args) ...{


// TODO Auto-generated method stub


PowerExponent pe = new PowerExponent();


boolean bRet = false;


long startMills = System.currentTimeMillis();


for(int i=1;i<64000;i++)




...{


bRet = pe.isPowerExponentNumber(i);


//System.out.println(i+"是幂指数吗?"+bRet);


if(bRet)




...{


System.out.println(i+"是幂指数");


}


}


bRet = pe.isPowerExponentNumber(2147395600);




if(bRet)




...{


System.out.println(2147395600+"是幂指数");


}




bRet = pe.isPowerExponentNumber(2*2*2*2*3*3*3*3*3*3*5*5*5*5);


System.out.println(2*2*2*2*3*3*3*3*3*3*5*5*5*5+"=2*2*2*2*3*3*3*3*3*3*5*5*5*5*7*7"+"是幂指数吗"+bRet);


long endMills = System.currentTimeMillis();


System.out.println("耗时"+(endMills - startMills));


//System.out.println(PowerExponent.FindGreatestCommonDivisor(2*2*2*3*3*3*7*7*11*13,2*2*2*3*3*5*7*13));


}


}





我的思路也在那篇文章中写过就是

所有质因数的个数构成的集合A{a1,a2,。。。}
而集合A中元素a1,a2,a3最大公约数s
如果s>1,那么N就是幂数。
比如果
2*2*2*2*3*3*3*3*3*3*3 质因数个数的集合{4,6}最大公约数为2〉1所以是幂数
5*5*5 质因数个数的集合{3}最大公约数为3>1所以是幂数

因为质因数个数的最大公约数为s
那么队以任意质因数 pi,它出现的次数为ai;
必有ai %s = 0,所以一定能够将该质因数pi 分成s组,每组ai/s个。他的积为pi^(ai/s)

这样就将将所有质因数都分成了s组
原数N= {pi^(ai/s)} ^s,所以幂指数为s,底数为 pi^(ai/s)之积 注 i=1,2,3,..
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: