题目编号
语言
全部语言
等级
全部等级
知识点
选择知识点 (0)
找到 1260 道单选题
EXY-SC-1275
第 226 题

小杨编写了一个如下的高精度除法函数,则横线上应填写的代码为( )。

const int MAXN = 1005; // 最大位数
struct BigInt {
    int d[MAXN]; // 存储数字,d[0]是个位,d[1]是十位,...
    int len;     // 数字长度
 
    BigInt() {
        memset(d, 0, sizeof(d));
        len = 0;
    }
};
 
// 比较两个高精度数的大小
int compare(BigInt a, BigInt b) {
    if (a.len != b.len) return a.len > b.len ? 1 : -1;
    for (int i = a.len - 1; i >= 0; i--) {
        if (a.d[i] != b.d[i]) return a.d[i] > b.d[i] ? 1 : -1;
    }
    return 0;
}
 
// 高精度减法
BigInt sub(BigInt a, BigInt b) {
    BigInt c;
    for (int i = 0; i < a.len; i++) {
        c.d[i] += a.d[i] - b.d[i];
        if (c.d[i] < 0) {
            c.d[i] += 10;
            c.d[i+1]--;
        }
    }
    c.len = a.len;
    while (c.len > 1 && c.d[c.len-1] == 0) c.len--;
    return c;
}
 
// 高精度除法 (a/b,返回商和余数)
pair<BigInt, BigInt> div(BigInt a, BigInt b) {
    BigInt q, r; // q是商,r是余数
 
    if (compare(a, b) < 0) { // 如果 a < b,商为0,余数为a
        q.len = 0;
        r = a;
        return make_pair(q, r);
    }
 
    // 初始化余数r为a的前b.len位
    r.len = b.len;
    for (int i = a.len - 1; i >= a.len - b.len; i--) {
        r.d[i - (a.len - b.len)] = a.d[i];
    }
 
    // 逐位计算商
    for (int i = a.len - b.len; i >= 0; i--) {
        // 把下一位加入余数
        if (r.len == 1 || r.d[0] != 0) {
            for (int j = r.len; j > 0; j--) {
                r.d[j] = r.d[j-1];
            }
            _______________________________ // 横线处
        } else {
            r.d[0] = a.d[i];
            r.len = 1;
        }
 
        // 计算当前位的商
        while (compare(r, b) >= 0) {
            r = sub(r, b);
            q.d[i]++;
        }
    }
 
    // 确定商的长度
    q.len = a.len - b.len + 1;
    while (q.len > 1 && q.d[q.len-1] == 0) q.len--;
 
    // 处理余数前导零
    while (r.len > 1 && r.d[r.len-1] == 0) r.len--;
 
    return make_pair(q, r);
}
A
r.d[0] = a.d[i];
r.len++;
B
r.d[i] = a.d[i];
r.len++;
C
r.d[i] = a.d[i];
r.len = 1;
D
r.d[0] = a.d[i];
r.len = 1;
语言: C++
GESP真题 五级
2025.6
单选题号: 15
EXY-SC-1274
第 227 题

关于下述 C++ 代码的快速排序算法,说法错误的是( )。

int randomPartition(std::vector<int>& arr, int low, int high) {
    int random = low + rand() % (high - low + 1);
    std::swap(arr[random], arr[high]);
 
    int pivot = arr[high];
    int i = low - 1;
 
    for (int j = low; j < high; j++) {
        if (arr[j] <= pivot) {
            i++;
            std::swap(arr[i], arr[j]);
        }
    }
    std::swap(arr[i + 1], arr[high]);
    return i + 1;
}
 
void quickSort(std::vector<int>& arr, int low, int high) {
    if (low < high) {
        int pi = randomPartition(arr, low, high);
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}
A

randomPartition 函数中,变量 i 的作用是记录大于基准值的元素的边界

B

randomPartition 函数随机选择基准值,可以避免输入数据特定模式导致的最坏情况下时间复杂度 $O(n^2)$

C

快速排序平均时间复杂度是 $O(n \log n)$

D

快速排序是稳定排序算法

语言: C++
GESP真题 五级
2025.6
单选题号: 14
EXY-SC-1273
第 228 题

硬币找零问题中要求找给客户最少的硬币。coins 存储可用硬币规格,单位为角,假设规格都小于 10 角,且一定有 1 角规格。amount 为要找零的金额,约定必须为 1 角的整数倍。输出为每种规格及其数量,按规格从大到小输出,如果某种规格不必要,则输出为 0。下面是其实现代码,相关说法正确的是( )。

const int MAX_COINS = 10;
int result[MAX_COINS] = {0};  // 假设最多10种面额
 
int find_coins(const vector<int>& coins, int amount) {
    sort(coins.begin(), coins.end(), greater<int>());
 
    int n = coins.size();
 
    for (int i = 0; i < n; ++i) {
        int coin = coins[i];
        int num = amount / coin;
        result[i] = num;
        amount -= num * coin;
        if (amount == 0) break;
    }
 
    cout << "找零方案如下:" << endl;
    for (int i = 0; i < n; ++i) {
        cout << sorted_coins[i] << "角需要" << result[i] << "枚" << endl;
    }
 
    return 0;
}
A

上述代码采用贪心算法实现

B

针对本题具体要求,上述代码总能找到最优解

C

上述代码采用枚举算法

D

上述代码采用分治算法

语言: C++
GESP真题 五级
2025.6
单选题号: 13
EXY-SC-1272
第 229 题

有关下面 C++ 代码的说法,错误的是( )。

double sqrt_binary(long long n, double epsilon = 1e-10) {
    if (n < 0) {
        throw invalid_argument("输入必须为非负整数");
    }
 
    if (n == 0 || n == 1) return n;
 
    // 阶段 1
    long long low = 1, high = n;
    long long k = 0;
 
    while (low <= high) {
        long long mid = (low + high) / 2;
        long long mid_sq = mid * mid;
 
        if (mid_sq == n) {
            return mid;
        } else if (mid_sq < n) {
            k = mid;
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }
 
    long long next_k = k + 1;
    if (next_k * next_k == n) {
        return next_k;
    }
 
    // 阶段 2
    double low_d = (double)k;
    double high_d = (double)(k + 1);
    double mid;
 
    while (high_d - low_d >= epsilon) {
        mid = (low_d + high_d) / 2;
        double mid_sq = mid * mid;
 
        if (mid_sq < n) {
            low_d = mid;
        } else {
            high_d = mid;
        }
    }
 
    double result = (low_d + high_d) / 2;
    long long check_int = (long long)(result + 0.5);
    if (check_int * check_int == n) {
        return check_int;
    }
 
    return result;
}
A

“阶段 1”的目标是寻找正整数 $n$ 可能的正完全平方根

B

“阶段 2”的目标是如果正整数 $n$ 没有正完全平方根,则在可能产生完全平方根附近寻找带小数点的平方根

C

代码 check_int = (long long)(result + 0.5) 是检查因浮点误差是否为正完全平方根

D

阶段 2 的二分法中 high_d - low_d >= epsilon 不能用于浮点数比较,会进入死循环

语言: C++
GESP真题 五级
2025.6
单选题号: 12
EXY-SC-1271
第 230 题

下面的 C++ 代码用于在升序数组 lst 中查找目标值 target 最后一次出现的位置。相关说法,正确的是( )。

int binary_search_last_occurrence(const vector<int>& lst, int target) {
    if (lst.empty()) return -1;
 
    int low = 0, high = lst.size() - 1;
 
    while (low < high) {
        int mid = (low + high + 1) / 2;
        if (lst[mid] <= target) {
            low = mid;
        } else {
            high = mid - 1;
        }
    }
 
    if (lst[low] == target)
        return low;
    else
        return -1;
}
A

lst 中存在重复的 target 时,该函数总能返回最后一个 target 的位置,即便 lst 全由相同元素组成

B

target 小于 lst 中所有元素时,该函数会返回 0

C

循环条件改为 while (low <= high) 程序执行效果相同,且能提高准确性

D

将代码中 (low + high + 1) / 2 修改为 (low + high) / 2 效果相同

语言: C++
GESP真题 五级
2025.6
单选题号: 11
当前页显示 226 - 230 ,共 1260 道单选题