CSP 2022 提高级第一轮 CSP-S 2022初试题 程序阅读第三题解析

一、代码查看

#include <iostream>
#include <algorithm>

using namespace std;
const int MAXL = 1000;

int n, k, ans[MAXL];

int main(void) 
{
    cin >> n >> k;
    if (!n) cout << 0 << endl;
    else 
    {
        int m = 0;
        while (n) 
        {
            ans[m++] = (n % (-k) + k) % k;
            n = (ans[m - 1] - n) / k;
        }
        for (int i = m - 1; i >= 0; i--)
            cout << char(ans[i] >= 10 ?
                         ans[i] + 'A' - 10 :
                         ans[i] + '0');
        cout << endl;
    }
    return 0;
}

二、关于负数的除法与求余 

负数的求余在不同的语言的编译器下运行结果不一样,以下是在C++语言中运行的效果。

负数的除法。

负数求余的符号由被除数决定!!!

三、题目分析

假设输入的 n 在 int 范围内,k 为不小于 2 且不大于 36 的正整数,完成下面的判断题和单选题:

判断题

1.  该算法的时间复杂度为O(log⁡kn)。(对)

【循环从n开始,每次除以n,所以O(logkn)】

【**这道题我觉得很奇怪,如果n是负数怎么办?但正确答案是对的😂】

2.  删除第 23 行的强制类型转换,程序的行为不变。(错)

【删除后可能输出整数】

3.  除非输入的 n 为 0,否则程序输出的字符数为 ⌊log⁡k∣n∣⌋+1。(对)

【⌊log⁡k∣n∣⌋就是m】

单选题

4.  当输入为“100 7”时,输出为(A)。

A. 202

B.  1515
C.  244
D.  1754

【    ans[0] = (100 % -7 + 7) % 7 = 100 % 7(因为100是正数所以也等于) = 2

        n =(2 - 100)/ 7 = -14

        ans[1] = -14 % -7 = 0

        n = 14 / 7 = 2

        ans[2] = 2 % -7 = 2 % 7 = 2

        n = (2 - 2) / 7 = 0

ans = [2, 0, 2]

答案 = (要倒过来)202        】

5.  当输入为“-255 8”时,输出为(B)。

A. 1400

B.  1401
C.  417
D.  400

【    ans[0] = (-255 % -8 + 8) % 8 = 1

        n = (1 - -255) = 256 / 8 = 32

        ans[1] = (32 % -8 + 8) % 8 = 32 % 8 = 0

        n = -32 / 8 = -4

        ans[2] = (-4 % -8 + 8) % 8 = 4

        n = 8 / 8 = 1

        ans[3] = 1 % -8 = 1 % 8(以后直接省略第一步) = 1

        n = (1 - 1) / 8 = 0

ans[1, 0, 4, 1]

答案 = (要倒过来)1401        】

6.  当输入为“1000000 19”时,输出为(B)。

A. BG939

B. 87GIB
C. 1CD428
D. 7CF1B

【    ans[0] = 1000000 % 19 = 11 (B)

        n = (11 - 1000000) / 19 = -52631

        ans[1] = (-52631 % -19 + 19) % 19 = 18 (I)

        n = (18 - -52631) / 19 = 2771

到这里可以确定倒数第一第二位。

看不懂评论区见,大家一起解答,有问题请反应~

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值