C++步长为7的数组遍历代码报错及遍历覆盖性问题求解
问题原因&修正方案
1. 编译&内存问题
- 原代码缺少
<iostream>头文件,调用cout会编译失败,同时引入了没用的<fstream>头文件可直接删除。 - main函数中存在内存泄漏:先执行
int* arr = new int[3];申请了堆内存,后续又把CreateArray返回的新堆内存指针赋值给arr,第一次申请的内存没有被释放,直接修改为int* arr = CreateArray(3);即可。
2. 核心逻辑错误
你要实现的是按步长7遍历打印数组元素,但现有StrideArray函数的逻辑是用计算出来的索引i对应的值覆盖原数组的j位置值,既没有实现打印逻辑,还直接破坏了原数组的内容,这就是输出值异常的核心原因。
正确逻辑应该是遍历过程中直接打印当前i对应的数组值,不要修改原数组内容。
3. 全元素遍历判定规则
当步长7和数组长度n的最大公约数gcd(7,n) == 1时,才能遍历到所有数组元素。由于7是质数,只要n不是7的正整数倍,都可以遍历全量元素;如果n是7的倍数(比如7、14、21等),则无法遍历全部元素,只会访问到总数量1/7的元素。
修正后完整代码
#include <iostream> #include <stdlib.h> using namespace std; int* CreateArray(int n); bool StrideArray(int arr[], int n); // 求最大公约数辅助函数 int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } int main() { int n = 3; int* arr = CreateArray(n); cout << "数组原始元素为:" << endl; for (int i = 0; i < n; i++) { cout << arr[i] << " "; } cout << endl; cout << "步长7遍历的元素序列为:" << endl; bool isFullAccess = StrideArray(arr, n); cout << endl << (isFullAccess ? "当前数组大小下可以遍历全部元素" : "当前数组大小下无法遍历全部元素") << endl; cout << "遍历后原数组元素为:" << endl; for (int i = 0; i < n; i++) { cout << arr[i] << " "; } delete[] arr; // 测试无法遍历全部元素的场景(n=7为7的倍数) cout << endl << "===== 测试n=7的场景 =====" << endl; n = 7; arr = CreateArray(n); cout << "数组原始元素为:" << endl; for (int i = 0; i < n; i++) { cout << arr[i] << " "; } cout << endl; cout << "步长7遍历的元素序列为:" << endl; isFullAccess = StrideArray(arr, n); cout << endl << (isFullAccess ? "当前数组大小下可以遍历全部元素" : "当前数组大小下无法遍历全部元素") << endl; delete[] arr; return 0; } int* CreateArray(int n) { int* arr = new int[n]; for (int i = 0; i < n; i++) { arr[i] = (rand() % 100); } return arr; } bool StrideArray(int arr[], int n) { int i = 0; for (int j = 0; j < n; j++) { i = (i + 7) % n; cout << arr[i] << " "; } return gcd(7, n) == 1; }
内容的提问来源于stack exchange,提问作者user16836761
相关产品推荐
相关产品推荐

