C++ 算法题:求解整数对满足特定条件
C++ 算法题:求解整数对满足特定条件
题目描述
给定两个整数 S 和 P,问是否有正整数对 (x, y),使得 x * y = S 且 2 * (x + y) = P。
如果有,则输出 Yes,并在第二行输出满足 x 最小的两个整数,否则则输出 No。
输入格式
第一行两个整数 S 和 P,中间用空格隔开。
输出格式
第一行一个字符串 Yes 或 No,表示是否有满足条件的整数对。
如果第一行为 Yes,则在第二行输出 x 最小的这整数对,中间用空格隔开。如果第一行为 No,则没有第二行。
输入输出样例
样例 1
- 输入样例:
12 16
- 输出样例:
Yes
2 6
样例说明:
2 * 6 = 12, 2 * (2 + 6) = 16
样例 2
- 输入样例:
12 1000
- 输出样例:
No
样例说明:
可以证明没有符合条件的 (x, y),故输出 No
思路:
根据题目条件可以得到以下两个等式:
x * y = S2 * (x + y) = P
将第一个等式变形得到:
y = S / x
带入第二个等式得到:
2 * (x + S / x) = P
化简得到:
2x^2 + 2S = Px
将等式变形得到二次方程:
2x^2 - Px + 2S = 0
根据二次方程的求根公式:
x = (P ± √(P^2 - 16S)) / 4
如果 P^2 - 16S < 0,则没有满足条件的整数对。
否则,可以得到两个 x 的解,分别记为 x1 和 x2,其中 x1 <= x2。
根据 x = S / y 和 x = x1,可以得到 y = S / x1。
所以满足条件的整数对为 (x1, y1) 和 (x2, y2)。
算法步骤:
- 读入
S和P。 - 计算
delta = P * P - 16 * S。 - 判断
delta是否小于 0,若小于 0,则输出No。 - 计算
x1 = (P - √delta) / 4和x2 = (P + √delta) / 4。 - 计算
y1 = S / x1和y2 = S / x2。 - 输出
Yes。 - 输出
x1和y1,如果x1 == x2,则只输出一个解。 - 输出
x2和y2。
代码示例:
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int S, P;
cin >> S >> P;
double delta = P * P - 16 * S;
if (delta < 0) {
cout << 'No' << endl;
} else {
double x1 = (P - sqrt(delta)) / 4;
double x2 = (P + sqrt(delta)) / 4;
double y1 = S / x1;
double y2 = S / x2;
if (x1 == x2) {
cout << 'Yes' << endl;
cout << x1 << ' ' << y1 << endl;
} else {
cout << 'Yes' << endl;
cout << x1 << ' ' << y1 << endl;
cout << x2 << ' ' << y2 << endl;
}
}
return 0;
}
注意:
- 代码中使用
sqrt函数计算平方根。 - 输出整数对时,使用
cout输出,并用空格隔开。 - 如果
x1和x2相等,则只输出一个解。
原文地址: http://www.cveoy.top/t/topic/qeI2 著作权归作者所有。请勿转载和采集!