2014-12-06 190 views
0

我在一个网络编程c中注册了几个算法练习。 我做了一个很简单的问题如下: 我收到4个数字,确定一个矩形的2个角的坐标,并且必须计算面积。 有一组测试,当第二个角落在第一个(x1> x2 || y1> y2)的左下方时,程序退出。 enter image description here优化c中的数学运算

例:

输入:

1 1 4 3 
0 0 1 1 
9 7 3 6 //Exit 

输出:

6 
1 

这是我的代码。

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

int main() 
{ 
    while(1) { 
     int x1, x2, y1, y2; 
     scanf("%d %d %d %d", &x1, &y1, &x2, &y2);//x1 y1 == A, x2 y2 == B 
     if(x1 > x2 || y1 > y2) 
      return 0; 
     printf("%d\n", (x2 - x1) * (y2 - y1)); 
    } 
} 

我的问题只是一个好奇心。我用“0052”的时间解决了这个问题,在我面前有3个人在“0048”和“0024”中设法解决! 我可以使用什么optimisazion方法来缩短时间?可能是指针?

+1

'scanf'和'printf'(每次刷新都会)比其他任何东西都慢(*多*)。 – 2014-12-06 22:58:39

+0

定时等待键盘输入的函数是无稽之谈。你正在为打字员计时。 – 2014-12-07 09:08:04

回答

2

的几点思考:

  1. 你可以使用gcc的__builtin_expect()功能,以确保该条件被认为是假的。

  2. 指针不太可能帮助您改进解决方案。

  3. scanf()可能是真的很慢的部分。用一个只有预期的十进制整数的解析器重写这个可能会快得多。目前,scanf()需要解析格式字符串,并且输入数字可以是八进制,十六进制或十进制。或者可能是无效输入。等等。

+0

我应该如何在我的程序中使用__builtin_expect()?我从来没有使用它,我不知道如何应用它。 – Raxkin 2014-12-06 22:55:16

+0

@Raxkin:我通常通过助手宏'很可能(x)'和'不太可能(x)'来使用它们:http://stackoverflow.com/questions/109710/likely-unlikely-macros-in-the-linux-内核 – 2014-12-06 23:47:08

+0

这个问题是一个完整的废话。它是计时器的标准I/O语句,程序员无法控制。 (其他陈述的时间 - 缩减两个基本的C表达式,没有什么可以优化 - 相比之下,可笑的是很小)。 – 2014-12-07 09:12:47

0

不多,但也许尝试在进入循环之前声明int x1, x2, y1, y2;

+0

我尝试过,但是当我做到这一点时,我得到的时间比我的最佳时间006更多 – Raxkin 2014-12-06 22:49:55

+0

您可能会发现生成的机器码相同。看看机器代码(特别是编译器试图优化)除了担心无单位的四位数时间数字之外没有任何损害。 (意见:即使在微观基准测试中,也不要担心时间低于5秒钟,做时间限制的基准测试,而不是循环计数。) – greybeard 2014-12-07 10:23:03

0
here are my suggestions: 
1) in the compile statement use: 
    gcc -O3 
2) place all working variables in global space rather than stack space 

int x1, x2, y1, y2;, area 
char buffer[100]; 
int main() 
{ 
    do 
    { 
     fgets(buffer, sizeof(buffer), stdin); 
     sprintf(buffer, "%d %d %d %d", &x1, &y1, &x2, &y2); 
     x2-=x1; 
     y2-=y1; 
     area = y2*x2; 
     printf("%d\n",area); // or perhaps puts(itoa(area)); 
    } while((0 <= x2) && (0 <= y2) 
    return(0); 
} 
+0

这是一个在线竞赛,你不需要编译你自己的代码并提交二进制 – smac89 2014-12-07 05:06:12

+0

这对我来说是什么,我没有提交任何二进制 – user3629249 2014-12-07 05:36:11

+0

你建议OP使用编译器优化标志。这就是为什么我说你在提交前不编译你的代码。在线裁判进行编译和测试,您只需编写代码 – smac89 2014-12-07 05:38:16