历年CSP-J初赛真题解析 | 2023年CSP-J初赛阅读程序(16-32)

学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。

附上汇总贴:历年CSP-J初赛真题解析 | 汇总_csp历年真题_热爱编程的通信人的博客-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。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值