题目链接
题目描述
小歪有两个整数 和
,他想找到这样一个整数
,使得这三个整数在经过排序后能成为一个等差数列。
解题思路
一个等差数列是指一组按顺序排列的数字,其中任意两个连续项之间的差都相等。这个差被称为公差。
假设我们已经有了两个数 和
,我们需要找到第三个数
,使得这三个数排序后能构成等差数列。设排序后的三个数为
,那么它们必须满足
。
我们可以分情况讨论 和
在这个有序数列中的位置:
-
和
是数列的相邻两项:
- 不妨假设
。
- 情况一:
和
是前两项。那么数列是
。公差为
。第三项
就应该是
。
- 情况二:
和
是后两项。那么数列是
。公差同样为
。第一项
就应该是
。
- 不妨假设
-
和
是数列的两端项:
- 同样假设
。数列是
。
- 此时,
必须是
和
的算术平均值,即
。
- 这个解只有在
是偶数时才存在(即
和
的奇偶性相同),因为
必须是整数。
- 同样假设
选择一个简单的通用解
题目要求我们给出任意一个可行的解即可。最简单、并且永远有整数解的方法,就是将 和
作为相邻项来构造第三个数。
我们可以先找出 和
中的较大值和较小值,然后计算出它们的差作为公差,再用较大值加上公差得到第三个数。
具体步骤:
- 找出
和
的最大值
和最小值
。
- 计算公差
。
- 计算第三个数
。
这个 一定能和
构成一个等差数列
。
例如,输入为 3 和 2:
,
。
- 公差
。
- 第三个数
。
- 最终的三个数是
,它们构成了一个等差数列。所以输出
是一个正确的答案。
代码
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
// 找出较大值,加上两者的差值
int c = max(a, b) + abs(a - b);
cout << c << endl;
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
// 找出较大值,加上两者的差值
int c = Math.max(a, b) + Math.abs(a - b);
System.out.println(c);
}
}
a, b = map(int, input().split())
# 找出较大值,加上两者的差值
c = max(a, b) + abs(a - b)
print(c)
算法及复杂度
- 算法:数学计算
- 时间复杂度:
,只需要进行几次简单的算术运算。
- 空间复杂度:
,只需要常数级别的额外空间。