在c中优化数学运算

时间:2014-12-06 22:36:48

标签: c algorithm optimization

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

例:

输入:

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));
    }
}

我的问题只是一种好奇心。我在&#34; 0052&#34;时解决了这个问题,在我面前有3个人设法在&#34; 0048&#34;和&#34; 0024&#34;! 我可以用什么优化方法来缩短时间?可能是指针?

3 个答案:

答案 0 :(得分:2)

一些想法:

  1. 您可以使用gcc的__builtin_expect()函数来确保假定条件为假。

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

  3. scanf()可能是非常缓慢的部分。使用仅预期十进制整数的解析器重写它可能会快得多。目前,scanf()需要解析格式字符串,输入的数字可以是八进制,十六进制或十进制。或者可能是无效输入。等

答案 1 :(得分:0)

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

答案 2 :(得分:0)

以下是我的建议:

  1. 在编译语句中使用:

    gcc -O3
    
  2. 将所有工作变量放在全局空间而不是堆栈空间

    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);
    }