- [自然语言描述]
计算两个非负整数p和q的最大公约数:若q是0,则最大公约数为p。否则,将p除以q得到余数r,p和q的最大公约数。 - [Java语言描述]
public static int gcd(int p, int q) {
if(q == 0) {
return p;
}
int r = p % q;
return gcd(q,r);
}
- [习题1.1.24]
给出使用欧几里得算法计算105和24的最大公约数的过程中得到的一系列p和q的值。扩展该算法中的代码得到一个程序Euclid,从命令行接受两个参数,计算它们的最大公约数并打印出每次调用递归方法时的两个参数。使用你的程序计算1 111 111 和 1 234 567的最大公约数。
public class Euclid {
public static int gcd(int p, int q) {
System.out.println("p="+p+",q="+q);
if(q == 0) {
return p;
}
int r = p % q;
return gcd(q,r);
}
@SuppressWarnings({ "static-access", "resource" })
public static void main(String[] args) {
Euclid eu = new Euclid();
int p,q;
Scanner scan = new Scanner(System.in);
p = scan.nextInt();
q = scan.nextInt();
System.out.println("最大公约数是"+eu.gcd(p, q));
}
}
- [习题1.1.25]
使用数学归纳法证明欧几里得算法能够计算任意一对非负整数p和q的最大公约数。
第一步:
基础步骤:求证gcd(p,q)=gcd(q,r)
证:令p=aq+r,其中p、a、q、r均为非负整数。
设整数d|p、d|q,则d|(p-aq),得p与q的公约数和q与r的公约数相同。
设整数d|q、d|r,则d|(aq+r),得q与r的公约数和p与r的公约数相同。基于上述两点
gcd(p,q)=gcd(q,r)。
第二步:
归纳步骤:设有gcd(p,q)=gcd(q,r),求证gcd(q,r)=gcd(r, q%r)
证:由gcd(p,q)=gcd(q,r)可得d|p、d|q、d|r、p=aq+r。
由于有q=⌊q/r⌋*r+q%r、d|q、d|r,所以有d|q%r所以有gcd(q,r)=gcd(r,q%r)。