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,会触发数组越界,导致未定义行为(甚至死循环)。
其他逻辑错误
- 条件判断错误:题目要求面积≤N坪,你写的是
arr[i] < lower_bound*pyeong,漏掉了等于的情况,会排除刚好达标的数据 - 未初始化数组:局部数组
arr未初始化,arr[0]是随机值,若第一个元素不符合条件,后续比较逻辑会出错 - 输出逻辑不严谨:无符合条件的房屋时,未处理输出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", ¤t_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
相关产品推荐
相关产品推荐

