阅读程序专题

本试卷共 6 道阅读程序题,包含判断题与选择题,每题均附标准答案与解析。请仔细阅读代码与题目描述,按要求作答,祝您考试顺利!
姓名
    ____________

程序 1:小模拟(统计某数位出现次数)

#include

using namespace std;

int n, k, cnt = 0;

void dep(int x) {

    int a;

    while(x > 1) {

        a = x % 10;

        if (a == k) cnt++;

        x = x / 10;

    }

}

int main() {

    cin >> n >> k;

    dep(n);

    cout << cnt << endl;

    return 0;

}

 

【程序1】判断题:将第 7 行“a = x % 10;”改为“a = x - x/10*10;”,程序的运行结果不会改变。
正确
错误
【程序1】判断题:如果 k>=10,则程序一定输出 0。
正确
错误
【程序1】判断题:如果 k=0,则程序一定输出 0。
正确
错误
【程序1】选择题:如果输入是 n=11123, k=1,程序的输出结果是()。
A.1
B.2
C.3
D.5
【程序1】选择题:如果输入是 n=12233, k=2,程序的输出结果是()。
A.1
B.2
C.3
D.5
-----------------------------------------------------------------------------------------------------------------------------------------------

程序 2:字符串模拟(字母桶计数)

#include

using namespace std;

char st[100];

int cnt[100];

int len, sum = 0;

int main() {

    scanf("%s", st);

    len = strlen(st);

    for(int i = 0; i < len; i++) {

        if (st[i] >= 'a' && st[i] <= 'z') st[i] = st[i] - 'a' + 'A';

    }

    for(int i = 0; i < len; i++) {

        if (st[i] >= 'A' && st[i] <= 'Z') {

            cnt[st[i]-'A']++;

        }

    }

    for(int i = 0; i < 26; i++) {

        printf("%d ", cnt[i]);

        sum = sum + cnt[i];

    }

    printf("\n");

    printf("%d\n", sum);

    return 0;

}

【程序2】判断题:若输入全为小写字母且互不相同,则输出一定为 26。
正确
错误
【程序2】判断题:大小写字母分别计数,因此 'A' 和 'a' 会被视为不同字符。
正确
错误
【程序2】判断题:若输入为空字符串,则程序会发生运行时错误。
正确
错误
【程序2】选择题:若输入字符串中没有任何字母(如全为数字或符号),程序输出是()。
A.1
B.26
C.52
D.0
【程序2】选择题:若输入为 "aAbBcCdD"(4 个不同小写+3 个不同大写,注意字母不重复),程序统计不同字母的个数为()。
A.3
B.5
C.7
D.26
-----------------------------------------------------------------------------------------------------------------------------------------------

程序 3:数组模拟(桶计数,从大到小取偶次)

#include

using namespace std;

int n, sum = 0, js = 0;

int a[1005], b[1005], maxn = 0;

int main() {

    cin >> n;

    for(int i = 1; i <= n; i++) {

        cin >> a[i];

        b[a[i]]++;

        if (a[i] > maxn) maxn = a[i];

    }

    for(int i = maxn; i >= 1; i--) {

        if (b[i] > 0) {

            js = js + 1;

            if (js % 2 == 0) sum += b[i];

        }

    }

    cout << sum << endl;

    return 0;

}

 

【程序3】判断题:程序从大到小遍历不同值,并累加偶数次序位上的频次。
正确
错误
【程序3】判断题:若 maxn 初始为 0,输入数据均为正整数,则 maxn 最终会更新为 a 数组中的最大值。
正确
错误
【程序3】判断题:将第 2 个 for 循环的起始条件改为 i=n 而不是 i=maxn,结果一定不变。
正确
错误
【程序3】选择题:若输入 n=5,a 数组为 1,2,3,4,5(各出现 1 次),程序输出是()。
A.2
B.3
C.4
D.5
【程序3】选择题:若频次分布为 1→2、2→1、3→3、4→1,程序输出 sum 为()。
A.3
B.5
C.7
D.9
-----------------------------------------------------------------------------------------------------------------------------------------------

程序 4:数组模拟(约瑟夫环变体)

#include

using namespace std;

int n, k, live[100];

int main() {

    cin >> n >> k;

    for(int i = 1; i <= n; i++) live[i] = 1;

    int ind=0;

    for(int i = 1; i < n; i++) {

        int bs = 0;

        while(bs != k) {

            ind++;

            if (ind > n) ind = 1;

            if (live[ind]==1) bs++;

        }

        live[ind] = 0;

    }

    for(int i = 1; i <= n; i++)

        if (live[i] == 1) cout << i << ' ';

    return 0;

}

 

【程序4】判断题:live 数组用 1 表示存活、0 表示出局,报数时只对 live[ind]==1 的人计数。
正确
错误
【程序4】判断题:ind 超过 n 时会回到 1,实现环形报数。
正确
错误
【程序4】判断题:程序最终输出的是最后一个存活者的编号。
正确
错误
【程序4】选择题:在特定输入下,程序输出的幸存者编号为 2,对应的选项是()。
A.1
B.2
C.n-1
D.n
【程序4】选择题:当 k 取某特殊值时,幸存者编号总是 n,对应选项是()。
A.n
B.1
C.n/2
D.2
-----------------------------------------------------------------------------------------------------------------------------------------------

程序 5:指向法(二分图配对计数)

#include

using namespace std;

int n, w1 = 0, w2 = 0;

int a[100], b[100];

int main() {

    int x, y;

    cin >> n;

    for(int i = 1; i <= n; i++) {

        a[i] = 0;

        b[i] = 0;

    }

    for(int i = 1; i <= n; i++) {

        cin >> x >> y;

        if (a[x] != 0) b[a[x]] = 0;

        else w1++;

        a[x] = y;

        b[y] = x;

    }

    for(int i = 1; i <= n; i++) {

        if (a[i] > 0) w2++;

        if (b[i] > 0) w2++;

    }

    cout << w1*2-w2 << endl;

    return 0;

}

 

【程序5】判断题:w2 统计的是 a、b 两个数组中大于 0 的元素总个数,且每个数对 (x,y) 一定贡献 2 个计数。
正确
错误
【程序5】判断题:若每次输入都把之前的映射完全覆盖且最终无有效映射,则 w2 一定等于 2n。
正确
错误
【程序5】判断题:b[y]=x 表示建立从 y 到 x 的反向映射,且可能覆盖旧值。
正确
错误
【程序5】选择题:在特定输入下,w1 的输出结果为 0,对应选项是()。
A.0
B.1
C.n
D.2n
【程序5】选择题:在特定输入下,w2 的输出结果为 99,对应选项是()。
A.0
B.99
C.100
D.200
-----------------------------------------------------------------------------------------------------------------------------------------------

程序 6:递归类(二分分治交换计数)

#include

using namespace std;

int n, a[1000], b[1000];

int ff(int l, int r) {

    if (l == r) return 1;

    int mid = (l+r) / 2, Lv = 0, Rv = 0;

    for(int i = l; i <= mid; i++)

        if (a[i] > b[i]) {

            Lv++;

            int tmp = a[i];

            a[i] = b[i];

            b[i] = tmp;

        }

    for(int i = mid+1; i <= r; i++)

        if (b[i] > a[i]) {

            Rv++;

            int tmp = a[i];

            a[i] = b[i];

            b[i] = tmp;

        }

    int lf = ff(l, mid);

    int rf = ff(mid+1, r);

    return lf * Lv + rf * Rv;

}

int main() {

    cin >> n;

    for(int i = 0; i < n; i++) cin >> a[i];

    for(int i = 0; i < n; i++) cin >> b[i];

    cout << ff(0, n-1) << endl;

【程序6】判断题:将递归边界“if(l == r) return 1;”改为“if(l > r) return 1;”,程序结果不变。
正确
错误
【程序6】判断题:交换第 21 行“int lf = ff(l, mid);”和第 22 行“int rf = ff(mid+1, r);”的顺序,结果不变。
正确
错误
【程序6】选择题:假设 n=10,且满足 a[i]=i,b[i]=n-1-i,则程序的输出是()。
A.0
B.1
C.10
D.100
【程序6】选择题:假设 n=100,且满足 a[i]=i,b[i]=n-1-i,则程序的输出是()。
A.0
B.100
C.5000
D.10000
【程序6】选择题:假设 n=10,且满足所有 b[i] > a[i],则程序的输出是()。
A.0
B.10
C.15
D.30

42题 | 被引用0次

模板修改
使用此模板创建