这个来自于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,..
3461

被折叠的 条评论
为什么被折叠?



