您的位置:首页 > 数据库

探秘ADO数据库访问技术有关信息

2012-07-23 11:00 295 查看
不管求最大公约数或最小公倍数,最佳途径都是先对正整数进行质因数分解。把两个数(op1, op2)的相同的所有质因数全找出来,它们的乘积就是最大公约数GCD,而GCD* (op1/GCD) * (op2/GCD)就是最小公倍数(LCM)。

 

第一步,先进行质因素分解。

 

1) 实现一个寻找质数的函数

def isPrime(self, op):
isPrime=True;
sqrRoot=int(math.sqrt(op));
#if op==2: return True;
for div in range(2,sqrRoot+2):
if 0==op%div and div<op:
isPrime=False;
break;
return isPrime;
def findPrimeList(self, op):
liPrime=[];
for num in range(2,op+1):
if self.isPrime(num):
liPrime.append(num);
return liPrime;

 

 

2)找出小于op1,op2的所有质数。

 

 

3) 用试除法求op1, op2的质因数,即用以上找出的质数逐一地去试除op1, op2,以判断哪些质数是它们的因数;试除到正平方根便可得出所有的质因数。

def primeFactorize(self, op1):
'''Find prime factors for op1.'''
liPrimeFactors=[];
sqrRoot=int(math.sqrt(op1));
#liPrimes=self.findPrimeList(sqrRoot+1);
liPrimes=self.findPrimeList(op1);
while True:
for div in liPrimes:
if 0==op1%div:
liPrimeFactors.append(div);
op1=op1/div;
break;
if op1==1: break;
if div==liPrimes[len(liPrimes)-1]: break;
return liPrimeFactors;

 

4) 求最大公约数与最小公倍数

def calGCDAndLCM(self, op1, op2):
liCommonFactors=[1];
liPrimeFactors1=self.primeFactorize(op1);
liPrimeFactors2=self.primeFactorize(op2);
print liPrimeFactors1;
print liPrimeFactors2;
for p in liPrimeFactors2:
if True==self.binSearch(liPrimeFactors1, p):
liPrimeFactors1.remove(p);
liCommonFactors.append(p);
product=1;
lcm = 1;
for f in liCommonFactors:
product*=f;
self.gcd = product;
self.lcm = op1 * (op2/product);

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: