【问题标题】:How to optimize the code to avoid a time limit error如何优化代码以避免时间限制错误
【发布时间】:2019-07-19 11:33:45
【问题描述】:

我正在为我的考试创建一个 prog。代码工作正常,但我收到时间限制错误。如何更好地编写此代码以避免此错误?

#include <stdlib.h>
#include <stdio.h>
#include <math.h>


int main()
{
  int a, sum;

   float b, i;
   i=0;
   sum=0;
   FILE *file1;
   file1=fopen("input.txt","w");
   do{
    fscanf(file1, "%d", &a);
    if(a!=0){
     sum=sum+a;
     i++;
    }
   } while(a!=0);
   fclose(file1);
   b=(sum/i);
   printf("%f", b);
   FILE *file2;
   file2=fopen("output.txt","w");
   fprintf(file2, "%f", b);
   fclose(file2);
   return 0;
}

【问题讨论】:

  • “时限错误”是什么意思?我认为您将代码放入检查其复杂性的系统中。此外,您需要解释问题是什么以及您希望得到什么结果。
  • float ii=0,为什么?
  • 虽然编译器并不真正关心空格和缩进,但对于我们试图阅读和理解代码的人类来说,这很重要。请编辑您的问题及其代码以获得一致的缩进。在代码中添加一两行“段落”也不错。
  • 代码工作正常... 发布的代码肯定不能“正常工作”。 file1=fopen("input.txt","w"); 打开input.txt 文件以进行写入 - 在将其截断为零字节后。假设您必须意味着在阅读模式下发布打开的@​​987654326@ 的代码,与该代码存在哪些其他差异?
  • 如果文件为空或不以数字开头(并且已正确打开),您最终将得到一个统一化的a,除非纯属偶然,否则您将永远循环

标签: c arrays file time-limiting


【解决方案1】:

这段代码是一个潜在的问题:

   do{
    fscanf(file1, "%d", &a);
    if(a!=0){
     sum=sum+a;
     i++;
    }
   } while(a!=0);

您不检查来自fscanf() 的返回值,因此当您到达输入文件的末尾时,如果您读取的最后一个值非零,您的代码将进入无限循环。

更好的解决方案:

   do{
    int numScanned = fscanf(file1, "%d", &a);

    // break loop if fscanf() fails for any reason
    if ( numScanned != 1 ) break;

    if(a!=0){
     sum=sum+a;
     i++;
    }
   } while(a!=0);

【讨论】:

    【解决方案2】:

    您可以删除 fscanf(file1, "%d", &a);从 do 而没有使用它,因为您正在以“w”模式打开 input.txt 文件,因此它将被截断并被视为新的空文件。所以,它里面没有任何内容。这样时间复杂度就会降低。

    【讨论】:

    • 这并没有真正提供解决方案或回答问题,是吗?如果它只是为了指出正确的方向,那么它应该是一个评论。如果您没有足够的声誉来撰写评论,那不是将其写为答案的借口。请不要这样做。
    猜你喜欢
    • 2019-04-07
    • 2013-04-06
    • 2021-08-09
    • 1970-01-01
    • 2021-05-22
    • 2019-11-17
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多