[英]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.