【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$。
题目分析
解题思路
- 读取测试数据的数量 $t$。
- 对于每组测试数据,读取正整数 $a$。
- 计算4次方根 $b$,即 $b=\sqrt[4]{a}$。
- 检查是否存在满足条件的正整数 $b$,即 $(int)b^4=a$。
- 如果存在满足条件的正整数 $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 进行授权