繁体   English   中英

优化C语言中的数学运算

[英]Optimize mathematical operations in c

我注册了Web编程c,其中进行了几种算法练习。 我做了一个非常简单的问题,如下所示:我收到4个数字,这些数字确定矩形2个角的坐标,并且必须计算面积。 有一组测试,当第二个角在第一个角的下方或左侧时(x1> x2 || y1> y2),程序退出。 在此处输入图片说明

范例:

输入:

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”! 我可以使用哪些优化方法来缩短时间? 可能是指针?

一些想法:

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

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

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

数量不多,但是可以尝试声明int x1, x2, y1, y2; 进入循环之前。

这是我的建议:

  1. 在compile语句中使用:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM