luogu-B4064 [GESP202412 二级] 寻找数字

luogu-B4064 [GESP202412 二级] 寻找数字

GESP二级真题,多层循环和分支练习,难度★✮☆☆☆。

luogu-B4064 [GESP202412 二级] 寻找数字

题目要求

题目描述

小杨有一个正整数 aa,小杨想知道是否存在一个正整数 bb 满足 a=b4a=b^4

输入格式

第一行包含一个正整数 tt,代表测试数据组数。

对于每组测试数据,第一行包含一个正整数代表 aa

输出格式

对于每组测试数据,如果存在满足条件的正整数 bb,则输出 bb,否则输出 1-1

输入 #1

3
16
81
10

输出 #1

2
3
-1

说明/提示

对于全部数据,保证有 1t1051\leq t\leq 10^51ai1081\leq a_i\leq 10^8


题目分析

解题思路

  1. 读取测试数据的数量 tt
  2. 对于每组测试数据,读取正整数 aa
  3. 计算4次方根 bb,即 b=a4b=\sqrt[4]{a}
  4. 检查是否存在满足条件的正整数 bb,即 (int)b4=a(int)b^4=a
  5. 如果存在满足条件的正整数 bb,则输出 bb,否则输出 1-1

注:如果用两层循环暴力寻找可能的整数,程序会超时。这里利用之前学到的一个小技巧,用数学方法求出四次方根,强转整数后再计算4次方,如果恰好是4次方根,则强转后的4次方等于待检查的数,否则不相等。

{% include custom/custom-post-content-inner.html %}

—·

示例代码

#include <cmath>
#include <iostream>

using namespace std;
int main() {
    int n; // 读取测试数据的数量
    cin >> n;
    int a; // 读取正整数 a
    for (int i = 1; i <= n; i++) {
        cin >> a;
        bool flag = false; // 初始化标志位
        double c = sqrt(sqrt(a)); // 计算4次方根
        int d = (int)c; // 强转为整数
        if (pow(d, 4) == a) { // 检查是否满足条件
            flag = true; // 如果满足条件,则设置标志位为真
        }
        if (flag) {
            cout << d << endl; // 如果存在满足条件的正整数,则输出
        } else {
            cout << -1 << endl; // 否则输出 -1
        }
    }
    return 0;
}

{% include custom/custom-post-content-footer.md %}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

luogu-”系列题目可在 洛谷题库 在线评测。

bcqm-”系列题目可在 编程启蒙题库 在线评测。

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
Last updated on