数组构造问题解析 题目: 小C希望构造一个包含n个元素的数组,且满足以下条件: 数组中的所有元素两两不同。 数组所有元素的最大公约数为 k。 数组元素之和尽可能小。 任务是输出该数组元素之和的最小值。 测试样例 样例1: 输入:n = 3 ,k = 1 输出:6 样例2: 输入:n = 2 ,k = 2 输出:6 样例3: 输入:n = 4 ,k = 3 输出:30 解题代码: #include #include #include
using namespace std;
int solution(int n, int k) { // 确保 k 是正数 if (k <= 0) return 0;
// 初始化数组和总和 int sum = 0; vector arr;
// 从 k 开始,依次选择 k 的倍数,直到数组中有 n 个元素 for (int i = 1; arr.size() < n; ++i) { int num = k * i; arr.push_back(num); sum += num; }
// 返回数组元素之和 return sum; }
int main() { std::cout << (solution(3, 1) == 6) << std::endl; std::cout << (solution(2, 2) == 6) << std::endl; std::cout << (solution(4, 3) == 30) << std::endl; }
一、思路剖析
本题旨在构造特定要求的数组并求其元素和最小值,核心思路围绕最大公约数与和最小化展开。既然数组所有元素最大公约数为 k ,那元素均可写成 k 乘以某整数形式。为保证元素两两不同且总和最小,从 k 起依次取不同倍数构建数组。如 k = 1 、 n = 3 时,选 1×1 、 1×2 、 1×3 ,对应 1 、 2 、 3 ,和为 6 ;当 k = 3 、 n = 4 是选 3×1 、 3×2 、 3×3 、 3×4 ,即 3 、 6 、 9 、 12 ,和是 30 ,巧妙契合测试样例结果,利用自然数序列倍数来满足条件。
二、代码详解
1. 函数声明与初始化: int solution(int n, int k) 定义函数接收元素个数 n 和最大公约数 k ,在函数内部,先对非法输入( k <= 0 )排除,直接返回 0 ,确保后续计算基于合理数据。接着定义 sum 存总和并初始为 0 , vector arr 用于存放构造出的数组元素。 2. 数组构建与求和循环: for (int i = 1; arr.size() < n; ++i) 循环是关键,从 i = 1 起,每次生成 k * i 作为新元素, arr.push_back(num) 将新元素存入数组,同时 sum += num 累加进总和,循环持续到数组 arr 元素个数达 n 个,以此按从小到大顺序选 k 的倍数填充数组并求和。 3. 返回结果:循环结束, return sum 将计算好的满足条件数组元素总和最小值返回,完成核心功能。 4. 主函数验证: main 函数里通过 std::cout << (solution(3, 1) == 6) << std::endl 等语句,将函数计算结果与预期样例结果对比输出(输出 1 代表相等正确, 0 代表错误),验证 solution 函数在不同输入下准确性。
三、知识点总结
1. 数论基础:最大公约数概念贯穿始终,理解数组元素与 k 的倍数关系基于此,反映数论在算法编程里构建规则、满足条件的运用,数论为程序逻辑奠基,把控数组元素内在数学联系。 2. 数组与容器操作: vector 容器灵活管理动态数组, push_back 便捷添加元素,按条件逐个添加 k 倍数构建目标数组,展示 C++标准模板库容器处理可变长数据结构优势,数组构建、存取、扩容知识融合运用。 3. 循环与逻辑控制: for 循环按步长取 k 倍数,依 arr.size() < n 控制循环次数,精准把控数组规模,体现编程里循环按条件迭代生成有序数据序列技巧,是实现复杂逻辑、达成程序目标的常用手段。 4. 函数封装与测试: solution 函数封装核心算法,参数传入、结果返回条理清晰, main 函数测试将预期结果与实际对比,凸显模块化编程与测试驱动开发思维,助于代码功能验证、错误排查,提升程序可靠性、可读性。