学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。
附上汇总贴:历年CSP-J初赛真题解析 | 汇总-CSDN博客
#include <iostream>
#include <cmath>
using namespace std;
double f(double a, double b, double c) { //海伦公式,求三角新面积。但a、b、c不一定能够组成一个三角形
double s = (a + b + c) / 2;
return sqrt(s * (s - a) * (s - b) * (s - c));
}
int main() {
cout.flags(ios::fixed); //定点形式显示浮点数
cout.precision(4); //指定小数位数为4位
int a, b, c;
cin >> a >> b >> c;
cout << f(a,b,c) << endl;
return 0;
}
假设输入的所有数都为不超过1000的正整数,完成下面的判断题和单选题:
16、当输入为“2 2 2”时,输出为“1.7321"。( )
【答案】:对
【解析】
将"2 2 2"带入计算,得到1.7321
17、将第7行中的“(s - b) * (s - c)”改“(s - c) * (s - b)”不会影响程序运行的结果。( )
【答案】:对
【解析】
乘法满足交换律,更换两者的顺序,不影响程序运行结果
18、程序总是输出四位小数。( )
【答案】对
【解析】
当a、b、c无法构成面积时,计算结果为0.0000,也仍然保留四位小数
19、当输入为“3 4 5”时,输出为( )
A."6.0000"
B."12.0000"
C."24.0000"
D."30.0000"
【答案】:A
【解析】
将"3 4 5"带入计算,其实就是求直角三角形的面积,得到6.0000,选A
20、当输入为“5 12 13”时,输出为( )。
A."24.0000"
B."30.0000"
C."60.0000"
D."120.0000"
【答案】:B
【解析】
同19题,也是求直角三角形的面积,得30.0000,选B
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int f(string x, string y) {
int m = x.size();
int n = y.size();
vector<vector<int>> v(m+1, vector<int>(n+1, 0));
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) { //v[i][j]表示字符串x和y的最长公共子序列的长度。子序列指的是可以在字符串中任意删掉一些字符后剩下的部分,公共子序列则要求同时是两个字符串的子序列
if (x[i-1] == y[j-1]) {
v[i][j] = v[i-1][j-1] + 1;
} else {
v[i][j] = max(v[i-1][j], v[i][j-1]);
}
}
}
return v[m][n];
}
bool g(string x, string y) {
if (x.size() != y.size()) { //先筛去两个字符串长度不一致的情况
return false;
}
return f(x + x, y) == y.size(); //在字符串x尾部再复制一份后进行判断
}
int main() {
string x, y;
cin >> x >> y;
cout << g(x, y) << endl;
return 0;
}
21、f函数的返回值小于等于min(n, m) 。( )
【答案】:对
【解析】
返回两个字符串的最长公共子序列长度,肯定不会超过某一个字符串的长度
22、f函数的返回值等于两个输入字符串的最长公共子串的长度。( )
【答案】:错
【解析】
子串不等于子序列,子串要求字符在原字符串中连续出现,而子序列只有顺序要求
23、当输入两个完全相同的字符串时, g函数的返回值总是true。( )
【答案】:对
【解析】
两个相同的字符串,公共子序列长度等于y字符串的长度,所以正确
24、将第19行中的“v[m][n]”替换为“v[n][m]",那么该程序( )。
A.行为不变
B.只会改变输出
C.一定非正常退出
D.可能非正常退出
【答案】:D
换为v[n][m],可能某一维下标访问会越界,此时会非正常退出。
25、当输入为“csp-j p-jcs”时,输出为( B )
A."0"
B."1"
C."T"
D."F"
【答案】:B
【解析】
如果一看代码就知道是求最长公共子序列,那直接可以得到答案。如果不了解,可以尝试打表,二维列表中的元素值为v[i][j]。具体打完的表如下:
i 0 1 2 3 4 5
j 0 0 0 0 0 0 0
1 0 0 0 0 1 1
2 0 0 0 0 1 2
3 0 1 1 1 1 2
4 0 1 2 2 2 2
5 0 1 2 3 3 3
6 0 1 2 3 4 4
7 0 1 2 3 4 5
8 0 1 2 3 4 5
9 0 1 2 3 4 5
10 0 1 2 3 4 5
v[5][5]等于5,与y字符串长度相同,选B
26、当输入为“csppsc spsccp”时,输出为( D )。
A."T"
B."F"
C."0"
D."1"
【答案】:D
【解析】
同25题,如果一下子看出是求最长公共子序列,那直接可以得到答案。如果不了解,可以尝试打表,二维列表中的元素值为v[i][j]。具体打完的表如下:
i 0 1 2 3 4 5 6
j 0 0 0 0 0 0 0 0
1 0 0 0 0 1 1 1
2 0 1 1 1 1 1 1
3 0 1 2 2 2 2 2
4 0 1 2 2 2 2 3
5 0 1 2 3 3 3 3
6 0 1 2 3 4 4 4
7 0 1 2 3 4 5 5
8 0 1 2 3 4 5 5
9 0 1 2 3 4 5 6
10 0 1 2 3 4 5 6
11 0 1 2 3 4 5 6
12 0 1 2 3 4 5 6
v[14][6]等于6,与y字符串长度相同,选D
#include <iostream>
#include <cmath>
using namespace std;
int solve1(int n) {
return n * n;
}
int solve2(int n) {
int sum = 0;
for (int i = 1; i <= sqrt(n); i++) {
if (n % i == 0) {
if (n/i == i) {
sum += i*i;
} else {
sum += i*i + (n/i)*(n/i);
}
}
}
return sum;
}
int main() {
int n;
cin >> n;
cout << solve2(solve1(n)) << " " << solve1(solve2(n)) << endl;
return 0;
}
27、如果输入的n为正整数, solve2函数的作用是计算n所有的因子的平方和。( )
【答案】:对
【解析】
通过第32题带入计算,n=5时,solve(25)得到651,可以推算出solve2函数的作用就是计算n的所有因子的平方和,即1+25+625=651
28、第13-14行的作用是避免n的平方根因子1(或n/i)进入第16行而被计算两次。( )
【答案】:对
【解析】
通过第32题带入计算,i=1时,第13-14行没有将其加到sum中,是在第16行被计算,所以描述正确
29、如果输入的n为质数, solve2(n)的返回值为n²+1。( )
【答案】:对
【解析】
通过第32题带入计算,n=5时,solve2(5)为26,符合题目描述
30、如果输入的n为质数p的平方, 那么solve2(n) 的返回值为( )。
A.p²+p+1
B.n²+n+1
C.n²+1
D.p^4+2p²+1
【答案】:D
【解析】
通过第32题,n=25,此时p=5,因为solve(25)=651,将p=5带入4个选项中,应该是p^4+p^2+1,D错误。将n=25带入4个选项中,B正确。
31、当输入为正整数时,第一项减去第二项的差值一定( )
A.大于0
B.大于等于0且不一定大于0
C.小于0
D.小于等于0且不一定小于0
【答案】:D
【解析】
通过第32题,第一项减去第二项的差值为负数,所以A、B肯定错误。满足差值为0的数,就是这个数的平方等于这个数的各个因子的平方和。1就是这个数,所以选D。
32、当输入为“5”时,输出为( )。
A."651 625"
B."650 729"
C."651 676"
D."652 625"
【答案】:C
【解析】
将5带入计算,solve2(solve(1))等于651,solve1(solve2(5))等于676,选C。