You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需指针实现数组素数元素与下一个元素交换的C语言方案

问题分析与修正方案

原代码的核心错误

  1. 素数判断函数逻辑完全错误:当前prime函数返回输入值,无法区分素数和非素数,应该返回布尔标识(1表示是素数,0表示不是)
  2. 数组交换逻辑无效:代码中仅做了prime(a[i]) == prime(a[i+1])的比较操作,没有实际交换数组元素
  3. 循环边界错误:处理交换时循环到n-1会导致越界访问a[i+1],应该只遍历到n-2
  4. 输出逻辑错误:最后仅打印了一个无效值,没有遍历输出整个处理后的数组
  5. 未匹配示例逻辑:原代码没有处理“交换素数后跳过下一个元素”的隐含规则(从示例可推断)

正确实现代码(无指针)

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 19:55:13