2020 年 12 月青少年软编等考 C 语言一级真题解析

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。注意 YESNO 都是大写字母!

时间限制: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 n2000000
  • 输出
    从输入整数到 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 位数,条件为:

  1. 该数为完全平方数。
  2. 该数至少有 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 1031 的范围内进行枚举即可。参考代码也用这种方式来实现。

还有一种方法是将枚举 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;
		// 检测是否满足条件 2
		if (a == b || a == c || b == c) {
			tot++;
			// 检测是否是第 n 个满足条件的
			if (tot == n) {
				cout << x << endl;
				break;
			}
		}
	}

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朔北之忘 Clancy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值