文章

【GESP】C++二级真题 luogu-B4064 [GESP202412 二级] 寻找数字

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

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

题目要求

题目描述

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

输入格式

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

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

输出格式

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

输入 #1

1
2
3
4
3
16
81
10

输出 #1

1
2
3
2
3
-1

说明/提示

对于全部数据,保证有 $1\leq t\leq 10^5$,$1\leq a_i\leq 10^8$。


题目分析

解题思路

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

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

—·

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#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;
}

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

GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

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

本文由作者按照 CC BY 4.0 进行授权