2013-07-11 4 views
1

Я пытаюсь решить некоторые проблемы в системе соревнований программирования и решить проблему с двумя точками, я не понимаю, почему мой код был оценен в 1181º всех представленных материалов.Как я могу получить этот код C быстрее других?

Как я могу сделать свой код быстрее, чем он есть?

#include <stdio.h> 
#include <math.h> 

int main(){ 
    register unsigned int x1,x2,y1,y2; 
    scanf("%i %i %i %i", &x1,&y1,&x2,&y2); 
    printf("%.4f", sqrt(pow(x2-x1,2) + pow(y2-y1, 2))); 
} 
+0

Включение переменных в регистры происходит не так быстро. С другой стороны, математические функции очень медленные. И используйте '% u' для сканирования' unsigned int '. – Kninnug

+1

[Быстрые приближенные функции расстояния] (http://www.flipcode.com/archives/Fast_Approximate_Distance_Functions.shtml) –

+0

Прежде всего, вы, вероятно, хотите избавиться от 'scanf'. Затем избавьтесь от математических функций. Затем используйте [формулу быстрого приближения] (http://mathforum.org/kb/thread.jspa?threadID=48233&messageID=170470). –

ответ

0

Вы можете избавиться от некоторых избыточных вызовов функций, а также избежать int-> преобразования с плавающей точкой:

#include <stdio.h> 
#include <math.h> 

int main(){ 
    double x1,x2,y1,y2; 
    scanf("%lf %lf %lf %lf", &x1,&y1,&x2,&y2); 
    printf("%.4f\n", sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))); 
    return 0; 
} 
5

Если вы не использовать pow(), вы не только избежать вызова функции, что это не нужно, если вам умножить (x2-x1) на себя (что может или не может быть оптимизировано - я не уверен), но вы можете отсрочить листинг до значения с плавающей запятой, пока не будет только один, до sqrt().

Если ваша фактическая проблема связана с чтением более чем одной строки ввода (и, если предположить, что целое число читается, как в вашем примере), я бы предположил, что наибольшая разница в производительности будет заключаться в том, чтобы отбросить scanf() в пользу хорошо написанной пользовательской функции используя, например, fread() от stdin.

+0

+1 - Есть ** много ** прекрасных причин, чтобы избавиться от вызовов 'scanf()'. Скорость - это только одна. Где я работаю, мы нашли в тестировании время выполнения мутного потока IO> scanf> itoa (мы использовали целые числа, но я подозреваю, что отношения одинаковы). Вне конкурентной среды вы также обнаружите, что scanf является наиболее подверженным ошибкам способом совершения конверсий. Считается также труднее читать. –