P6352 [COCI 2007/2008 #3] CETIRI
记录22
#include <bits/stdc++.h>
using namespace std;
int gcd(int a, int b) {if (b == 0) return a;return gcd(b, a % b);
}
int main(){int a[10]={};for(int i=1;i<=3;i++) cin>>a[i];sort(a+1,a+4);int t=gcd(a[2]-a[1],a[3]-a[1]); for(int i=1;i<=4;i++){int x=a[1]+(i-1)*t;if(a[i]!=x){cout<<x;break;} } return 0;
}
突破点
你原本有 4 个数,它们从小到大排序后构成了等差数列。
但是现在丢失了一个数,并且其余的三个数的顺序也被打乱了。
思路
等差数列公式 an=a1+(n-1)*d
因为是SPJ,所以默认最小的是第一项a1,然后求出来d就行了
用gcd来求d,关于gcd的详细介绍,放在文章的补充部分
代码简析
int gcd(int a, int b) {if (b == 0) return a;return gcd(b, a % b);
}
gcd求最大公约数,即求等差数列公式 an=a1+(n-1)*d 中的d
sort(a+1,a+4);int t=gcd(a[2]-a[1],a[3]-a[1]);
sort从小到大排序,a+1到a+4是数组的a[1],a[2],a[3]
然后t存储的就是等差数列公式中的d
for(int i=1;i<=4;i++){int x=a[1]+(i-1)*t;if(a[i]!=x){cout<<x;break;} }
知道a1,知道d,所以依次比对四项,然后输出缺少的那一项
x是其正常排列入的顺序
补充
最大公约数(GCD)详解
1. 最大公约数(GCD)概述
定义:最大公约数(Greatest Common Divisor,GCD)是指两个或多个整数共有约数中最大的一个。
应用:最大公约数在数学和计算机科学中有着广泛的应用,例如简化分数、解决同余方程等。
2. 欧几里得算法
定义:欧几里得算法(Euclidean Algorithm)是一种高效的计算两个整数最大公约数的方法。
原理:基于以下性质:
两个整数 a 和 b(假设 a>b)的最大公约数等于 b 和 amodb 的最大公约数。
当 b 为 0 时,最大公约数为 a。
3. 代码实现
3.1 代码
int gcd(int a, int b) {if (b == 0) return a;return gcd(b, a % b); }
3.2 代码解释
函数定义
int gcd(int a, int b)
:定义了一个名为gcd
的函数,接受两个整数参数 a 和 b。基本情况
if (b == 0) return a;
:如果 b 为 0,返回 a。
解释:当 b 为 0 时,根据欧几里得算法的原理,a 就是最大公约数。
递归调用
return gcd(b, a % b);
:如果 b 不为 0,递归调用gcd
函数,参数为 b 和 amodb。
解释:根据欧几里得算法的原理,两个整数 a 和 b 的最大公约数等于 b 和 amodb 的最大公约数。
4. 示例分析
4.1 示例1:计算 GCD(48,18)
初始调用
gcd(48, 18)
:
b 不为 0,递归调用
gcd(18, 48 % 18)
。48mod18=12,所以调用
gcd(18, 12)
。第一次递归
gcd(18, 12)
:
b 不为 0,递归调用
gcd(12, 18 % 12)
。18mod12=6,所以调用
gcd(12, 6)
。第二次递归
gcd(12, 6)
:
b 不为 0,递归调用
gcd(6, 12 % 6)
。12mod6=0,所以调用
gcd(6, 0)
。基本情况
gcd(6, 0)
:
b 为 0,返回 a,即 6。
最终,GCD(48,18)=6。
4.2 示例2:计算 GCD(6,9)
初始调用
gcd(6, 9)
:
b 不为 0,递归调用
gcd(9, 6 % 9)
。6mod9=6,所以调用
gcd(9, 6)
。第一次递归
gcd(9, 6)
:
b 不为 0,递归调用
gcd(6, 9 % 6)
。9mod6=3,所以调用
gcd(6, 3)
。第二次递归
gcd(6, 3)
:
b 不为 0,递归调用
gcd(3, 6 % 3)
。6mod3=0,所以调用
gcd(3, 0)
。基本情况
gcd(3, 0)
:
b 为 0,返回 a,即 3。
最终,GCD(6,9)=3。
5. 代码完整示例
以下是一个完整的C++程序,展示如何使用
gcd
函数计算两个整数的最大公约数:#include <iostream> using namespace std;// 定义gcd函数 int gcd(int a, int b) {if (b == 0) return a;return gcd(b, a % b); }int main() {int num1, num2;// 输入两个整数cout << "请输入两个整数:";cin >> num1 >> num2;// 调用gcd函数并输出结果cout << "最大公约数是:" << gcd(num1, num2) << endl;return 0; }
6. 总结
最大公约数(GCD):两个或多个整数共有约数中最大的一个。
欧几里得算法:一种高效的计算最大公约数的方法,基于递归调用和模运算。
代码实现:
基本情况:当 b 为 0 时,返回 a。
递归调用:当 b 不为 0 时,递归调用
gcd(b, a % b)
。通过上述步骤,可以清晰地理解最大公约数的计算过程,并使用欧几里得算法高效地实现这一计算。