欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > 2021 年 12 月青少年软编等考 C 语言三级真题解析

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

2025/1/20 5:08:09 来源:https://blog.csdn.net/qq_39710484/article/details/136780350  浏览:    关键词:2021 年 12 月青少年软编等考 C 语言三级真题解析

目录

  • T1. 我家的门牌号
    • 思路分析
  • T2. 子串计算
    • 思路分析
  • T3. 吃糖果
    • 思路分析
  • T4. 拨钟问题
    • 思路分析
  • T5. 分形盒
    • 思路分析

T1. 我家的门牌号

我家住在一条短胡同里,这条胡同的门牌号从 1 1 1 开始顺序编号。

若所有的门牌号之和减去我家门牌号的两倍,恰好等于 n n n,求我家的门牌号及总共有多少家。

数据保证有唯一解。

时间限制:1 s
内存限制:64 MB

  • 输入
    一个正整数 n n n n < 100000 n < 100000 n<100000
  • 输出
    一行,包含两个正整数,分别是我家的门牌号及总共有多少家,中间用单个空格隔开。
  • 样例输入
    100
    
  • 样例输出
    10 15
    

思路分析

此题考查枚举法,属于入门题。这里提供两种比较简单,容易实现的方法,更详细的解析见【青少年软编等考 2021-12 三级】我家的门牌号这篇文章。

根据题意,我们可以列出方程 t o t a l × ( t o t a l + 1 ) 2 − 2 × m y _ h o m e = n \frac{total\times (total+1)}{2} - 2\times my\_home = n 2total×(total+1)2×my_home=n,其中 t o t a l total total 表示总户数, m y _ h o m e my\_home my_home 表示我家门牌号。

于是我们可以用双重循环枚举求解此题,由于 m y _ h o m e my\_home my_home 受到 t o t a l total total 的限制,因此外层循环枚举 t o t a l total total,内层循环枚举 m y _ h o m e my\_home my_home,更易于验证。

/** Name: T1_1.cpp* Problem: 我家的门牌号* Author: Teacher Gao.* Date&Time: 2024/11/19 20:44*/#include <iostream>using namespace std;int main()
{int n;cin >> n;for (int total = 1; ; total++) {for (int my_home = 1; my_home <= total; my_home++) {int sum = total * (total + 1) / 2;if (sum - 2 * my_home == n) {cout << my_home << " " << total << endl;return 0;}}}return 0;
}

事实上,对于两个未知数,一个等式的不定方程,我们可以将方程中的未知数分开两边: t o t a l × ( t o t a l + 1 ) 2 − n = 2 × m y _ h o m e \frac{total\times (total+1)}{2} - n = 2\times my\_home 2total×(total+1)n=2×my_home,利用等式的性质,用单层循环枚举可解。

具体来说,等式右边应满足 2 ≤ 2 × m y _ h o m e ≤ 2 × t o t a l 2 \le 2 \times my\_home \le 2\times total 22×my_home2×total,并且 m y _ h o m e my\_home my_home 为整数,因为题目数据保证有唯一解,于是只要方程左边满足上述条件即为答案。

/** Name: T1_2.cpp* Problem: 我家的门牌号* Author: Teacher Gao.* Date&Time: 2024/11/19 20:46*/#include <iostream>using namespace std;int main()
{int n;cin >> n;for (int total = 1; ; total++) {int t = total * (total + 1) / 2 - n;if (2 <= t && t <= 2 * total && t % 2 == 0) {int my_home = t / 2;<

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com