[英]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”! 我可以使用哪些优化方法来缩短时间? 可能是指针?
一些想法:
您可以使用gcc的__builtin_expect()
函数来确保该条件为假。
指针不可能帮助您改进解决方案。
scanf()
可能是最慢的部分。 用解析器重写该解析器,即只有预期的十进制整数可能会快得多。 当前, scanf()
需要解析格式字符串,并且输入数字可以是八进制,十六进制或十进制。 或可能是无效的输入。 等等
数量不多,但是可以尝试声明int x1, x2, y1, y2;
进入循环之前。
这是我的建议:
在compile语句中使用:
gcc -O3
将所有工作变量放在全局空间而不是堆栈空间中
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.