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

质数判断C语言代码优化及误判问题求助

问题分析与代码优化方案

原代码的核心错误

  1. 变量作用域冲突:函数内声明了int i,但for循环里又重新定义了int i = 2,这导致循环内的i是局部变量,函数级的i始终未被初始化,后续if (i == a)的判断使用的是随机值,完全失效。
  2. 循环逻辑错误:循环终止条件设为i <= a,当i等于a时,任何数都能被自身整除,会触发printf("No")并break,导致所有质数都会被错误判定。
  3. 边界情况未处理:未考虑输入为1、2等特殊值的情况,比如输入2时,循环直接进入i=2的判断,输出No。
  4. 重复输出问题:循环内输出No后,后续的分支又会再输出一次No,导致重复打印。

修正后的代码

#include <stdio.h>

int main() {
    int a;
    int i;
    scanf("%d", &a);

    // 处理边界情况:小于等于1的数不是质数
    if (a <= 1) {
        printf("No");
        return 0;
    }
    // 2是最小的质数
    if (a == 2) {
        printf("Yes");
        return 0;
    }

    // 循环检查到a的平方根即可,减少循环次数
    for (i = 2; i * i <= a; i++) {
        if (a % i == 0) {
            printf("No");
            return 0;
        }
    }

    // 能走到这里说明没有找到因数,是质数
    printf("Yes");
    return 0;
}

优化说明

  • 作用域修复:去掉for循环内的int声明,让循环使用函数级的i变量,保证逻辑一致性。
  • 效率提升:循环终止条件改为i * i <= a,等价于检查到sqrt(a)——如果a有大于其平方根的因数,必然存在一个对应的小于平方根的因数,这样能大幅减少循环次数。
  • 边界处理:单独处理a<=1和a=2的情况,避免进入不必要的循环,同时保证特殊值的判断正确。
  • 输出逻辑简化:一旦找到因数直接输出No并返回,循环结束后直接输出Yes,避免重复打印。

内容的提问来源于stack exchange,提问作者jay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 06:47:47