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

C语言代码输出错误数值:为何结果与预期不符?

C语言查找缺失数字的错误修复

需求说明

读取第一行的两个整数m和n,接着读取长度为n的数组;检查1到m的数字是否存在于该数组中,输出所有不存在的数字。

问题场景

示例输入:

3 3
1 2 4

预期输出:3(注:原描述中预期输出写为4属于笔误,根据m=3,检查范围是1-3,数组中缺失的是3)
实际输出:1122333

原代码错误分析

#include <stdio.h>

int main()
{
    int m = 0;
    int n;
    int i , j;
    int x[100];
    scanf("%d", &m);
    scanf("%d", &n);
    for(i = 0 ;i < n;i++)
    {
        scanf("%d", &x[i]);
    }
    for(j = 1;j <= m;j++)
    {
        for(i = 0; i < n;i++)
        {
            if(x[i] != j)
            {
                printf("%d", j);
            }
        }
    }
}

核心错误在于逻辑判断逻辑颠倒且触发条件错误:

  • 原代码中,只要数组元素不等于当前j就打印j,导致每个j会被多次打印(数组中有多少个不等于j的元素,就打印多少次j)。比如j=1时,数组中2、4不等于1,就会打印两次1;j=3时,数组中所有元素都不等于3,就会打印三次3,最终输出1122333。
  • 输入读取可优化:原代码用两次scanf读取m和n,虽能运行,但合并为一次读取更符合第一行输入两个整数的场景。

修复后的代码

#include <stdio.h>

int main()
{
    int m, n;
    int i, j;
    int x[100];
    // 一次性读取第一行的两个整数
    scanf("%d %d", &m, &n);
    for(i = 0; i < n; i++)
    {
        scanf("%d", &x[i]);
    }
    // 遍历1到m的每个数字,检查是否存在
    for(j = 1; j <= m; j++)
    {
        int exists = 0; // 标记当前数字是否存在于数组
        for(i = 0; i < n; i++)
        {
            if(x[i] == j)
            {
                exists = 1;
                break; // 找到匹配项后直接跳出循环,减少不必要遍历
            }
        }
        // 仅当数字不存在时打印
        if(!exists)
        {
            printf("%d\n", j);
        }
    }
    return 0;
}

修复说明

  1. 输入读取优化:将两次scanf合并为scanf("%d %d", &m, &n);,更贴合第一行输入两个整数的场景,避免潜在的输入处理问题。
  2. 增加存在标记:对每个待检查的数字j,用exists变量标记是否在数组中找到匹配项,找到后立即跳出内层循环,提升效率。
  3. 正确控制打印时机:只有当遍历完整个数组都未找到j时,才打印该数字,确保每个缺失数字仅输出一次。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:52:37