无需指针实现数组素数元素与下一个元素交换的C语言方案
问题分析与修正方案
原代码的核心错误
- 素数判断函数逻辑完全错误:当前
prime函数返回输入值,无法区分素数和非素数,应该返回布尔标识(1表示是素数,0表示不是) - 数组交换逻辑无效:代码中仅做了
prime(a[i]) == prime(a[i+1])的比较操作,没有实际交换数组元素 - 循环边界错误:处理交换时循环到
n-1会导致越界访问a[i+1],应该只遍历到n-2 - 输出逻辑错误:最后仅打印了一个无效值,没有遍历输出整个处理后的数组
- 未匹配示例逻辑:原代码没有处理“交换素数后跳过下一个元素”的隐含规则(从示例可推断)
正确实现代码(无指针)
#include <stdio.h> #define MAX_ARRAY_LEN 100 // 判断是否为素数:返回1是素数,0不是 int is_prime(int num) { // 小于2的数不是素数 if (num < 2) { return 0; } // 从2到num/2遍历判断 for (int i = 2; i <= num / 2; i++) { if (num % i == 0) { return 0; // 能被整除,不是素数 } } return 1; // 是素数 } int main() { int n, a[MAX_ARRAY_LEN]; // 输入数组长度 printf("输入数组长度:\n"); scanf("%d", &n); // 输入数组元素 printf("输入%d个数组元素:\n", n); for (int i = 0; i < n; i++) { scanf("%d", &a[i]); } // 打印原数组 printf("原数组:\n"); for (int i = 0; i < n; i++) { printf("%d ", a[i]); } printf("\n"); // 处理数组:素数与下一个元素交换,交换后跳过下一个元素 int i = 0; while (i < n - 1) { // 确保i+1不越界 if (is_prime(a[i])) { // 交换a[i]和a[i+1] int temp = a[i]; a[i] = a[i+1]; a[i+1] = temp; i += 2; // 跳过交换后的下一个元素(匹配示例逻辑) } else { i += 1; } } // 打印处理后的数组 printf("处理后的数组:\n"); for (int i = 0; i < n; i++) { printf("%d ", a[i]); } printf("\n"); return 0; }
关键逻辑说明
- 素数判断函数:修正为返回布尔值,明确区分素数和非素数,处理了小于2的边界情况
- 数组处理逻辑:使用
while循环控制遍历,当遇到素数时交换元素,然后跳过下一个元素(i +=2),这是匹配示例结果的核心规则;非素数则正常递增索引 - 边界处理:循环只到
n-2(即i < n-1),避免访问数组越界 - 无指针实现:全程使用数组下标访问元素,未使用任何指针操作
内容的提问来源于stack exchange,提问作者oxcy
相关产品推荐
相关产品推荐

