1. 定理证明
证明:a, b 的最大公约数,同时也是 b, a mod b 的最大公约数
若 g 为 a, b(不同时为0)的公约数,则 g 满足:
其中l, m为整数。a和b又可表示为下式:
变形后得到:
所以得到 a、b 的公约数同时也必是 b、a mod b 的公约数
假设 g 是 a、b 的最大公约数,但他并不是 a mod b 的最大公约数
即存在 ,且 同时整除 b, a mod b
则存在整数
,
使得下式成立:
同时有:
所以
也同时整除 a,则
同时也是 a, b 的公约数,与题目不符合
所以可证得:a, b 的最大公约数,同时也是 b, a mod b 的最大公约数
2. 问题求解
我们把求 a、b 的最大公约数转换成了求 b、a mod b 的最大公约数, 那么问题不变而数据规模则明显变小, 我们可以不断重复该过程, 直到问题缩小成求某个非零数与零的最大公约数,这样,该非零数即是所求。
过程
- 若 a, b 全为0,则他们的最大公约数不存在
- 若 a, b 其中之一为0, 则他们的最大公约数为 a, b 中非零的那一个
- 若 a, b 都不为0,则使 ,
- 重复过程
3. T
最大公约数
描述: 输入两个正整数,求其最大公约数。
输入: 测试数据有多组,每组输入两个正整数。
输出: 对于每组输入,请输出其最大公约数。
样例输入:
49 14
样例输出:
7
3. 1 Non Recursive
//
// main.cpp
// GCD_NonRecursive
//
// Created by Apple on 2019/8/19.
// Copyright © 2019 Apple_Lance. All rights reserved.
//
#include <iostream>
#include <stdio.h>
int gcd(int a, int b){
while(b != 0){
int tmp = a % b;
a = b;
b = tmp;
}
return a;
}
int main(int argc, const char * argv[]) {
// insert code here...
int a, b;
while(scanf("%d%d", &a, &b) != EOF)
printf("%d", gcd(a, b));
return 0;
}
3. 2 Recursive
//
// main.cpp
// GCD
//
// Created by Apple on 2019/8/19.
// Copyright © 2019 Apple_Lance. All rights reserved.
//
#include <iostream>
#include <stdio.h>
using namespace std;
int gcd(int a, int b){
if(b == 0)
return a;
else
return gcd(b, a%b);
}
int main(int argc, const char * argv[]) {
// insert code here...
int a, b;
while (scanf("%d%d", &a, &b))
printf("%d", gcd(a, b));
return 0;
}