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

C语言作业超时问题求助:房屋面积筛选程序优化

C语言作业超时问题求助与代码改进建议

我是C语言初学者,正在完成作业时遇到问题:本地在VS Code和Code::Blocks中测试代码正常,但提交至学校的测试平台时显示“timeout”(超时),怀疑是循环导致的问题,求代码改进建议。

题目要求

给定房屋面积上限N(单位:坪,pyeong),以及一组房屋面积{hi}(单位:m²),找出满足面积转换为坪后≤N的最大h。单位转换规则:1坪=3.3058m²。

  • 输入:两行,第一行是整数N,第二行是用空格分隔的若干float类型hi(数量≥1)
  • 输出:两行,第一行是选中h转换为坪的数值,第二行是h本身,均保留两位小数;若无符合条件的房屋,两行均输出0(注:题目描述提及保留三位小数,但示例为两位,可根据实际要求调整格式符)

输入输出示例

示例1

输入:

5
5.7 10.1 20.4 15.2 17.6

输出:

4.60
15.20

示例2

输入:

20
59.528 34.141 73.272 62.509

输出:

18.91
62.51

我的代码

#include <stdio.h>

int main(){
    
    int lower_bound;
    int count = 0; //the index where the element is to be inserted
    float arr[10];//initialize an array
    float pyeong = 3.3058;
    

    //get lower bound
    scanf("%d", &lower_bound);
    //get the size(float numbers)
    do {
        scanf("%f", &arr[count++]);

    }while (getchar() != '\n');

    //resize the array
    //arr[count];

    //print array element
    for (int i = 0; i < count; i++){
        if(arr[i] < lower_bound*pyeong){
            if(arr[i]> arr[0]){ //compare which one is bigger
                arr[0] = arr[i];//put the bigger one in the front
            }
        }else{
            arr[i] = 0;
        }
    }
    //printf("%.2f\n", lower_bound*pyeong);
    printf("%.2f\n", arr[0]/pyeong);
    printf("%.2f\n", arr[0]);
    
    return 0;
}

超时原因与改进建议

超时核心原因

你的代码超时问题出在输入读取的循环逻辑:

  • 用do-while(getchar() != '\n')逐个读取字符来判断输入结束,当输入数据量较大时,这种方式效率极低;同时你定义的数组arr[10]大小固定,若输入的hi数量超过10,会触发数组越界,导致未定义行为(甚至死循环)。

其他逻辑错误

  1. 条件判断错误:题目要求面积≤N坪,你写的是arr[i] < lower_bound*pyeong,漏掉了等于的情况,会排除刚好达标的数据
  2. 未初始化数组:局部数组arr未初始化,arr[0]是随机值,若第一个元素不符合条件,后续比较逻辑会出错
  3. 输出逻辑不严谨:无符合条件的房屋时,未处理输出0的情况

改进后的代码

#include <stdio.h>

int main() {
    int N;
    const float PYEONG_TO_M2 = 3.3058;
    float max_h = 0.0;
    float current_h;

    // 读取上限N
    scanf("%d", &N);
    float threshold = N * PYEONG_TO_M2; // 转换为m²的阈值

    // 循环读取所有hi,直到输入结束(scanf返回1表示成功读取一个float)
    while (scanf("%f", &current_h) == 1) {
        if (current_h <= threshold) { // 修复条件:包含等于的情况
            if (current_h > max_h) {
                max_h = current_h;
            }
        }
    }

    // 按要求输出结果
    if (max_h == 0.0) {
        printf("0.00\n");
        printf("0.00\n");
    } else {
        printf("%.2f\n", max_h / PYEONG_TO_M2);
        printf("%.2f\n", max_h);
    }

    return 0;
}

关键改进点

  • 边读边处理:不需要存储所有hi,节省内存同时避免数组大小限制和越界问题
  • 高效输入:用scanf的返回值判断输入结束,自动跳过空格、换行符,比getchar()更可靠高效
  • 修复逻辑错误:修正条件判断为<=,初始化max_h为0,确保无符合条件时输出0
  • 代码简洁:去掉不必要的数组操作,逻辑更清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:35:15