编程题目解析:填空题与杨辉三角

需积分: 0 0 下载量 37 浏览量 更新于2024-08-04 收藏 9KB MD 举报
"题解.md" 这篇“题解.md”文件包含了解答两个不同类型的问题的代码:填空题和编程题。下面将详细解释这两个部分涉及的知识点。 ## 一、填空题 这部分代码是一个C++程序,用于解决一个字符串子串的计数问题。程序的主要目标是计算给定字符串的所有非空子串的数量。 ```c++ #include <bits/stdc++.h> using namespace std; int main() { string str; set<string> m; cin >> str; for (int i = 0; i < str.size(); i++) { for (int j = i + 1; j <= str.size(); j++) { string s = str.substr(i, j - i); m.insert(s); } } cout << m.size(); return 0; } ``` - **字符串操作**:`substr`函数用于提取字符串的子串,它接受两个参数,第一个是开始位置,第二个是子串的长度。 - **集合(set)**:在C++中,`set`是一个容器,它存储唯一元素,并自动保持排序。在这里,它用于存储所有不同的子串,避免重复。 - **循环**:外层循环遍历字符串的每个字符,内层循环生成以当前字符为起点的子串。 - **插入操作**:`m.insert(s)`将新生成的子串添加到集合中。如果子串已经存在,`insert`操作将不会改变集合大小。 - **输出结果**:最后,`cout << m.size()`打印出集合的大小,即不同子串的数量。 ## 二、编程题 ### 1. 杨辉三角 这部分代码是解决计算杨辉三角中特定位置的数并查找特定值的问题。 ```c++ #include<iostream> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; LL C(int a, int b) // 计算组合数C(a, b) { LL res = 1; for (int i = a, j = 1; j <= b; i--, j++) { res = res * i / j; if (res > n) return res; // 大于n已无意义,且防止爆LL } return res; } bool check(int k) { // 二分搜索找到大于等于该值的第一个数 int l = 2 * k, r = max(n, l); while (l < r) { int mid = l + r >> 1; if (C(mid, k) >= n) r = mid; else l = mid + 1; } if (C(r, k) != n) return false; cout << 1ll * (r + 1) * r / 2 + k + 1 << endl; return true; } int main() { cin >> n; // 从第16斜行枚举 for (int i = 16;; i--) if (check(i)) break; return 0; } ``` - **杨辉三角**:在数学中,杨辉三角是一个二维数组,其中每个数是上面两数之和。这个程序是用来查找特定行中,某个特定组合数等于给定值`n`的行号。 - **二分查找**:`check`函数使用了二分查找算法来寻找满足条件的行号,它有效地减少了查找次数。 - **组合数计算**:`C(a, b)`函数用于计算组合数C(a, b),即从a个不同元素中选取b个元素的组合数。 - **溢出处理**:在计算过程中,如果结果超过了`LL`类型的最大值,为了避免溢出,程序会直接返回当前值。 - **循环枚举**:从第16行开始,逐行检查,直到找到满足条件的行。 ### 2. 双向排序 这部分代码没有给出完整,但看起来是要求实现一个排序功能,可能是对两个已排序数组进行合并,或者对一个数组进行双向排序。通常,`cmp1`和`cmp2`是用于比较元素的函数,可能用于定义排序顺序。 ```c++ #include <bits/stdc++.h> using namespace std; #define ll long long bool cmp1(int a, int b) { return a > b; } bool cmp2(int a, int b) { return a < b; } ``` - **自定义比较函数**:`cmp1`和`cmp2`可能是用于定义排序规则的函数。`cmp1`可能会用于降序排列,而`cmp2`则用于升序排列。 - **预定义宏`#define ll long long`**:这是一种常见的用法,用于定义一个别名,使得代码更易读,这里的`ll`表示`long long`类型。 请注意,由于第二部分的代码不完整,无法提供更详细的解释。完整的代码应包括主函数中如何调用这些比较函数以及排序过程的详细描述。
2022-10-22 上传