我在网络编程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));
}
}
我的问题只是一种好奇心。我在&#34; 0052&#34;时解决了这个问题,在我面前有3个人设法在&#34; 0048&#34;和&#34; 0024&#34;! 我可以用什么优化方法来缩短时间?可能是指针?
答案 0 :(得分:2)
一些想法:
您可以使用gcc的__builtin_expect()
函数来确保假定条件为假。
指针不太可能帮助您改进解决方案。
scanf()
可能是非常缓慢的部分。使用仅预期十进制整数的解析器重写它可能会快得多。目前,scanf()
需要解析格式字符串,输入的数字可以是八进制,十六进制或十进制。或者可能是无效输入。等
答案 1 :(得分:0)
不多,但可能在进入循环之前尝试声明int x1, x2, y1, y2;
。
答案 2 :(得分:0)
以下是我的建议:
在编译语句中使用:
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);
}