目录
- T1. 字符三角形
- 思路分析
- T2. 计算 (a + b) × (c - b) 的值
- T3. 晶晶赴约会
- 思路分析
- T4. 角谷猜想
- 思路分析
- T5. 求满足条件的 3 位数
- 思路分析
T1. 字符三角形
给定一个字符,用它构造一个底边长 5 5 5 个字符,高 3 3 3 个字符的等腰字符三角形。
时间限制:1 s
内存限制:64 MB
- 输入
输入只有一行,包含一个字符。 - 输出
该字符构成的等腰三角形,底边长 5 5 5 个字符,高 3 3 3 个字符。 - 样例输入
*
- 样例输出
**** *****
思路分析
此题考查字符的输入输出,属于入门题。按照样例输出的格式编写代码输出即可,注意第 1 1 1 行和第 2 2 2 行前面的空格。
/** Name: T1.cpp* Problem: 字符三角形* Author: Teacher Gao.* Date&Time: 2024/04/06 09:30*/#include <iostream>using namespace std;int main()
{char ch;cin >> ch;cout << " " << ch << endl;cout << " " << ch << ch << ch << endl;cout << ch << ch << ch << ch << ch << endl;return 0;
}
T2. 计算 (a + b) × (c - b) 的值
此题为 2023 年 9 月一级第二题原题,见 2023 年 9 月青少年软编等考 C 语言一级真题解析中的 T2。
T3. 晶晶赴约会
晶晶的朋友贝贝约晶晶下周一起去看展览,但晶晶每周的 1 1 1、 3 3 3、 5 5 5 有课必须上课,请帮晶晶判断她能否接受贝贝的邀请,如果能则输出 YES
;如果不能则输出 NO
。注意 YES
和 NO
都是大写字母!
时间限制:1 s
内存限制:64 MB
- 输入
输入有一行,贝贝邀请晶晶去看展览的日期,用数字 1 1 1 到 7 7 7 表示从星期一到星期日。 - 输出
输出有一行,如果晶晶可以接受贝贝的邀请,输出YES
;否则,输出NO
。 - 样例输入
2
- 样例输出
YES
思路分析
此题考查分支结构与逻辑运算,属于入门题。
此题只需要判断输入的数值是否为 1 1 1、 3 3 3、 5 5 5 中的一个,若是则输出 NO
,否则输出 YES
即可。
/** Name: T3.cpp* Problem: 晶晶赴约会* Author: Teacher Gao.* Date&Time: 2024/04/07 12:23*/#include <iostream>using namespace std;int main()
{int x;cin >> x;if (x == 1 || x == 3 || x == 5) {cout << "NO" << endl;}else {cout << "YES" << endl;}return 0;
}
T4. 角谷猜想
所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘 3 3 3 加 1 1 1;如果是偶数,则除以 2 2 2,得到的结果再按照上述规则重复处理,最终总能够得到 1 1 1。如,假定初始整数为 5 5 5,计算过程分别为 16 16 16、 8 8 8、 4 4 4、 2 2 2、 1 1 1。
程序要求输入一个整数,将经过处理得到 1 1 1 的过程输出来。
时间限制:1 s
内存限制:64 MB
- 输入
一个正整数 n n n, n ≤ 2000000 n \le 2000000 n≤2000000。 - 输出
从输入整数到 1 1 1 的步骤,每一步为一行,每一步中描述计算过程。最后一行输出End
。如果输入为 1 1 1,直接输出End
。 - 样例输入
5
- 样例输出
5*3+1=16 16/2=8 8/2=4 4/2=2 2/2=1 End
思路分析
此题考察循环结构与分支结构,属于入门题。
此题只需要按照题意进行模拟即可。由于不知道循环次数,因此选用 while
语句较为恰当,循环条件写为 n > 1
,在循环体内判断 n n n 的奇偶性,并根据奇偶性进行相应的计算、赋值更新,以及输出相应步骤。注意循环结束后需要输出 End
。
/** Name: T4.cpp* Problem: 角谷猜想* Author: Teacher Gao.* Date&Time: 2024/04/07 13:56*/#include <iostream>using namespace std;int main()
{int n;cin >> n;while (n > 1) {if (n % 2) {cout << n << "*3+1=" << n*3 + 1 << endl;n = n*3 + 1;}else {cout << n << "/2=" << n / 2 << endl;n = n / 2;}}cout << "End" << endl;return 0;
}
T5. 求满足条件的 3 位数
编写程序,按从小到大的顺序寻找同时符合条件 1 1 1 和 2 2 2 的所有 3 3 3 位数,条件为:
- 该数为完全平方数。
- 该数至少有 2 2 2 位数字相同。
例如, 100 100 100 同时满足上面两个条件。
时间限制:1 s
内存限制:64 MB
- 输入
输入一个数 n n n, n n n 的大小不超过实际满足条件的 3 3 3 位数的个数。 - 输出
输出为第 n n n 个满足条件的 3 3 3 位数(升序)。 - 样例输入
1
- 样例输出
100
思路分析
此题考察枚举法,属于循环结构的一般应用题,求解方法比较多样,有的代码复杂但容易想到,有的代码简单但不容易想到。
首先此题需要一个计数器变量 tot
来统计满足条件的 3 3 3 位数的数量。程序主体部分可以采用循环枚举所有三位数,对每个三位数进行条件 1 1 1 和 2 2 2 的判断,若同时满足两个条件,则将计数器变量 tot
累加一次;然后判断 tot
是否等于 n n n,若是,则输出此刻对应的 3 3 3 位数即可。条件 2 2 2 是比较好判断的,但是条件 1 1 1 判断起来比较麻烦,可以采用 sqrt
结合类型转换来简化代码。若不知道 sqrt
函数,那么就可能需要用循环去枚举了,更好的做法是用二分。但是很显然 sqrt
和二分都不属于一级的考察范畴,绝大部分教练也不会让学生在学完 sqrt
之后再去考一级。虽然用循环枚举也能解决,但我们还是希望能有一个更好的解决方案。
更好的方案是将循环枚举 3 3 3 位数调整为枚举平方根,这样就不需要判断条件 1 1 1 了,而且可以极大的加快程序运行效率。由于最小 3 3 3 位数是 100 100 100,它的平方根是 10 10 10,而最大三位数是 999 999 999,它的平方根约等于 31.6 31.6 31.6,因此我们只需要在 10 ∼ 31 10 \sim 31 10∼31 的范围内进行枚举即可。参考代码也用这种方式来实现。
还有一种方法是将枚举 3 3 3 位数的循环改成 3 3 3 层循环,每层循环枚举 3 3 3 位数的一个位,这样对于条件 2 2 2 的判断就不需要数位分离操作了,效果与第一种方法类似,程序运行效率也完全一致,此处不再赘述。
/** Name: T5.cpp* Problem: 求满足条件的 3 位数* Author: Teacher Gao.* Date&Time: 2024/04/07 14:00*/#include <iostream>using namespace std;int main()
{int n, tot = 0;cin >> n;for (int i = 10; i <= 31; i++) {int x = i * i; // 确保满足条件 1// 数位分离int a = x % 10;int b = x / 10 % 10;int c = x / 100;// 检测是否满足条件 2if (a == b || a == c || b == c) {tot++;// 检测是否是第 n 个满足条件的if (tot == n) {cout << x << endl;break;}}}return 0;
}