一、审题
题目描述
小明是一位有理想的小学生,他每天上学都会先做完全校的乘法作业。
这一天,他的乘法作业是这样的:
1×81 × 81×8
2×42 × 42×4
3×63 × 63×6
5×x5 × x5×x
7×97 × 97×9
小明发现其中有一个算式中的一位xxx被忘记了。他知道其他算式的结果,所以他可以计算出这个算式的结果。请你帮助他找出这个被忘记的数字。
输入格式
共四行,每行一个整数,分别表示前三个算式的结果以及第四个算式中另一位。
输出格式
共一行,一个整数,表示第四个算式中被忘记的那个数字。
样例输入
8
8
18
30
样例输出
6
来源
2016年CSP-S第二轮考试真题
二、简单的思路
1. 逆向思考
题目要求我们求出第四个算式中被忘记的那个数字,根据题目我们可以列出如下式子:
1×8=81\times8=81×8=8
2×4=82\times4=82×4=8
3×6=183\times6=183×6=18
5×x=?5\times x=?5×x=?
7×9=637\times9=637×9=63
从前三个式子可以看出,当两个数的乘积已知时,这两个数不一定就是唯一的,还可以是其他的组合,例如第三个式子3×6=183 × 6 = 183×6=18,就可以转化为6×3=186 × 3 = 186×3=18。因此,我们可以将前三个式子的结果保存下来,第四个式子的结果也可以使用这些结果来计算。
2. 尝试写代码
我们先遍历前三个式子,将其结果保存在数组中,代码如下:
int a[3];
for (int i = 0; i < 3; i++) {
cin >> a[i];
}
然后,我们根据第四个式子中已知的数5,将这个式子分解成两个数的乘积,再通过已知的结果去求出另一个数,即为第四个式子中忘记的数字。代码如下所示:
int x;
for (int i = 1; i <= 9; i++)
{
if (i == 5) continue;
bool flag = true;
for (int j = 0; j < 3; j++)
{
if (i * a[j] == 30)
{
flag = false;
break;
}
}
if (flag)
{
x = i;
break;
}
}
三、根据思路的完整代码
#include <iostream>
using namespace std;
int main()
{
int a, b, c, d;
cin >> a >> b >> c >> d;
// 特例先行
if (a == 0 || b == 0 || c == 0 || d == 0)
{
cout << 0;
return 0;
}
int e = a * b * c;
if (d % a == 0)
{
cout << d / a;
return 0;
}
if (d % b == 0)
{
cout << d / b;
return 0;
}
if (d % c == 0)
{
cout << d / c;
return 0;
}
// 常规操作
for (int i = 1; i <= e; i++)
{
if (i % a == 0 && i % b == 0 && i % c == 0 && i * d == e)
{
cout << i;
return 0;
}
}
// 都不符合,输出0
cout << 0;
return 0;
}
文章讨论了如何通过已知乘法结果反推出缺失数字的数学问题,涉及编程解决思路。
142

被折叠的 条评论
为什么被折叠?



