B4064 [GESP202412 二级] 寻找数字

· · 题解

欢迎报名洛谷网校,期待和大家一起进步!

:::align{center} :::

本题考查循环结构、循环嵌套以及常见的数学函数的使用。

本题需要读入 t 个正整数,因此使用循环结构进行读入每一个 a。接下来问题在于如何找到正整数 b 了。这里介绍两种做法:

做法 1:枚举法。要问是否存在 b,可以让 b1,2,3,\dots 一直循环下去,直到发现了 b^4=a 或者发现不存在这个情况为止。什么情况下会不存在这个情况呢?随着 b 的增大,b^4 不断增大,因此当 b^4>a 的时候,若还没有发现 b^4=a 的情况,就可以认为不存在 b^4=a 了。

在编写代码中,可以使用 pow(b, 4) 表示 b^4,也可以简单地使用 b * b * b * b 编写。

参考代码(部分):

for (int b = 1; pow(b, 4) <= a; b++) {
    if (pow(b, 4) == a) {
        cout << b << endl;
        flag = true; //记录得到了一组解
    }
}
//若无解需要输出 -1

做法 2:开根法。如果 b 是一个整数,那么 b^2 也是一个整数,b^4 也是一个整数。因此 \sqrt{b^4}=b^2\sqrt{b^2}=b 均为整数。

从而想到:可以直接对 a 开四次根号,将得到的结果保留整数部分记作 b。如果计算发现 b^4=a,那么说明存在 b,否则不存在。计算 a 的四次根号,可以使用 sqrt(sqrt(a)),也可以使用 pow(a, 1.0 / 4)

参考代码(部分):

int b = sqrt(sqrt(a));
if (pow(b, 4) == a)
    cout << b << endl;
else
    cout << -1 << endl;