202412-1 寻找数字
题目描述
小杨有一个正整数 a,小杨想知道是否存在一个正整数 b 满足 a=b^4。
输入格式
第一行包含一个正整数 t,代表测试数据组数。
对于每组测试数据,第一行包含一个正整数代表 a。
输出格式
对于每组测试数据,如果存在满足条件的正整数 b,则输出 b,否则输出 -1。
样例输入 1
3
16
81
10
样例输出 1
2
3
-1
提示
对于全部数据,保证有 1\leq t\leq 10^5,1\leq a_i\leq 10^8。
代码解析
求 a 的算术平方根的算术平方根,将其结果赋值给 b,因为 b 是
int
类型,会将小数部分全部删除,若 b^4 和 a 相等,则找到了这样一个数字。
#include<bits/stdc++.h>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int a;
cin >> a;
int b = sqrt(sqrt(a));
if (b*b*b*b == a) cout << b << endl;
else cout << -1 << endl;
}
return 0;
}
202412-2 数位和
题目描述
小杨有 n 个正整数,小杨想知道这些正整数的数位和中最大值是多少。“数位和”指的是一个数字中所有数位的和。例如:对于数字 12345,它的各个数位分别是 1,2,3,4,5。将这些数位相加,得到
因此,12345 的数位和是 15。
输入格式
第一行包含一个正整数 n,代表正整数个数。
之后 n 行,每行包含一个正整数。
输出格式
输出这些正整数的数位和的最值。
样例输入 1
3
16
81
10
样例输出 1
9
提示
对于全部数据,保证有 1\leq n\leq 10^5,每个正整数不超过 10^{12}。
代码解析
对每个数字进行数位剥离求和,求和之后拿
sum
打擂台求最大值即可,注意数据范围,使用long long
。
#include<bits/stdc++.h>
using namespace std;
int main() {
long long n, max = 0;
cin >> n;
while (n--) {
long long t, sum = 0;
cin >> t;
while (t) {
sum += t%10;
t /= 10;
}
max = max > sum ? max : sum;
}
cout << max;
return 0;
}
202409-1 数位之和
题目描述
小杨有 n 个正整数,他认为一个正整数是美丽数字当且仅当该正整数每一位数字的总和是 7 的倍数。
小杨想请你编写一个程序判断 n 个正整数哪些是美丽数字。
输入格式
第一行包含一个正整数 n,表示正整数个数。
之后 n 行,每行一个包含一个正整数 a_i。
输出格式
对于每个正整数输出一行一个字符串,如果是美丽数字则输出 Yes
,否则输出 No
。
样例输入 1
3
7
52
103
样例输出 1
Yes
Yes
No
提示
对全部的测试数据,保证 1 \leq n \leq 10^5,1 \leq a_i \leq 10^5。
代码解析
对每组数字进行数位剥离求和,再去判断数位和是否为 7 的倍数即可
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
while(n--) {
int a, sum = 0;
cin >> a;
while(a) {
sum += a % 10;
a /= 10;
}
if (sum % 7 == 0) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}
202409-2 小杨的 N 字矩阵
题目描述
小杨想要构造一个 m \times m 的 N 字矩阵(m 为奇数),这个矩阵的从左上角到右下角的对角线、第 1 列和第 m 列都是半角加号 +
,其余都是半角减号 -
。例如,一个 5 \times 5 的 N 字矩阵如下:
+---+
++--+
+-+-+
+--++
+---+
请你帮小杨根据给定的 m 打印出对应的 N 字矩阵。
输入格式
输入只有一行包含一个正整数 m。
输出格式
输出对应的 N 字矩阵。
样例输入 1
5
样例输出 1
+---+
++--+
+-+-+
+--++
+---+
提示
【数据规模与约定】
对全部的测试数据,保证 3 \leq m \leq 49 且 m 是奇数。
代码解析
找规律,每一行的第一列与最后一列是
+
,主对角线(i == j
)是+
,其余都是-
#include<bits/stdc++.h>
using namespace std;
int main() {
int m;
cin >> m;
for (int i = 0; i < m; i++) {
for (int j = 0; j < m; j++)
if (i == j || j == 0 || j == m-1)
cout << '+';
else
cout << "-";
cout << endl;
}
return 0;
}
202406-1 平方之和
题目描述
小杨有 n 个正整数 a_1,a_2,\dots,a_n,他想知道对于所有的 i (1\le i\le n),是否存在两个正整数 x 和 y 满足 x\times x+y \times y=a_i。
输入格式
第一行包含一个正整数 n,代表正整数数量。
之后 n 行,每行包含一个正整数,代表 a_i。
输出格式
对于每个正整数 a_i,如果存在两个正整数 x 和 y 满足 x\times x+y \times y=a_i,输出 Yes
,否则输出 No
。
样例输入 1
2
5
4
样例输出 1
Yes
No
提示
对于第一个正整数,存在 1\times 1+2 \times 2=5,因此答案为 Yes
。
对于全部数据,保证有 1 \le n \le 10,1 \le a_i \le 10^6。
代码解析
每个数字 a,我们需要找到一个 x 和一个 y,满足
x*x + y*y == a
,我们在这里使用枚举法,通过 for 循环枚举x
的值,然后通过a - x*x
得到b
,如果b
的算数平方根是整数的话,这个整数就是符合条件的 y,如果b
的算数平方根不是整数,说明当前 x 的取值没有符合题意的整数 y,如果 x 枚举结束之后依然没有找到符合条件的y
,输出 No。
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, a;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a;
bool flag = false;
for (int x = 1; x*x < a; x++) {
int b = a - x*x;
// 判断 b 的算数平方根是不是整数
int y = sqrt(b);
if (y * y == b) {
flag = true;
break;
}
}
if (flag) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}
202406-2 计数
题目描述
小杨认为自己的幸运数是正整数 k(注:保证 1 \le k\le 9)。小杨想知道,对于从 1 到 n 的所有正整数中, k 出现了多少次。
输入格式
第一行包含一个正整数 n。
第二行包含一个正整数 k。
输出格式
输出从 1 到 n 的所有正整数中, k 出现的次数。
样例输入 1
25
2
样例输出 1
9
提示
从 1 到 25 中,2 出现的正整数有 2,12,20,21,22,23,24,25 ,一共出现了 9 次。
对于全部数据,保证有 1 \le n\le 1000,1 \le k\le 9。
代码解析
对 1~n 之间的每一个数字进行十进制数位剥离,统计
k
出现了多少次即可,注意不要对循环变量i
直接进行数位剥离,会导致死循环
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, k, cnt = 0;
cin >> n >> k;
for (int i = 1; i <= n; i++) {
int t = i;
while (t) {
if (t % 10 == k) cnt++;
t /= 10;
}
}
cout << cnt;
return 0;
}
202403-1 乘法问题
题目描述
小 A 最初刚刚学习了乘法,为了帮助他练习,我们给他若干个正整数,并要求他将这些数乘起来。
对于大部分题目,小 A 可以精确地算出答案,不过,若这些数的乘积超过 10^6,小 A 就不会做了。
请你写一个程序,告诉我们小 A 会如何作答。
输入格式
第一行一个整数 n,表示正整数的个数。
接下来 n,每行一个整数 a。小 A 需要将所有的 a 乘起来。
输出格式
输出一行,如果乘积超过 10^6,则输出 >1000000
;否则输出所有数的乘积。
样例输入 1
2
3
5
样例输出 1
15
样例输入 2
3
100
100
100
样例输出 2
1000000
样例输入 3
4
100
100
100
2
样例输出 3
>1000000
提示
对全部的测试数据,保证 1 \leq n \leq 50,1 \leq a \leq 100。
代码解析
这里使用一个小技巧,主函数中遇到
return 0;
程序就会直接结束,所以当乘积 > 1000000,就直接输出内容,终止程序
注意
ans
是累计相乘的变量,所以初始值是 1
#include<iostream>
using namespace std;
int main() {
int n, x, ans = 1;
cin >> n;
while (n--) {
cin >> x;
ans *= x;
if (ans > 1000000) {
cout << ">1000000";
return 0;
}
}
cout << ans;
return 0;
}
202403-2 小杨的日字矩阵
题目描述
小杨想要构造一个 N\times N 的日字矩阵(N 为奇数),具体来说,这个矩阵共有 N 行,每行 N 个字符,其中最左列、最右列都是 |
,而第一行、最后一行、以及中间一行(即第 \frac{N+1}{2} 行)的第 2\sim N-1 个字符都是 -
,其余所有字符都是半角小写字母 x
。例如,一个 N = 5 日字矩阵如下:
|---|
|xxx|
|---|
|xxx|
|---|
请你帮小杨根据给定的 N 打印出对应的“日字矩阵”。
输入格式
一行一个整数 N(5\leq N \leq 49,保证 N 为奇数)。
输出格式
输出对应的“日字矩阵”。
请严格按格式要求输出,不要擅自添加任何空格、标点、空格等任何符号。你一个恰好输出 N 行,每行除了换行符外恰好包含 N 个字符,这些字符要么是 -
,要么是 |
,要么是 x
。你的输出必须和标准答案完全一致才能得分,请在提交前仔细检查。
样例输入 1
5
样例输出 1
|---|
|xxx|
|---|
|xxx|
|---|
样例输入 2
7
样例输出 2
|-----|
|xxxxx|
|xxxxx|
|-----|
|xxxxx|
|xxxxx|
|-----|
代码解析
观察输出
'-', 'x', '|'
的坐标规律即可
第一行
i == 1
,最后一行i == N
,中间行i == (N+1)/2
#include<iostream>
using namespace std;
int main() {
int N;
cin >> N;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (j == 1 || j == N)
cout << '|';
else if (i == 1 || i == (N+1)/2 || i == N)
cout << '-';
else
cout << 'x';
}
cout << endl;
}
return 0;
}