用c语言优化数学运算

用c语言优化数学运算,c,algorithm,optimization,C,Algorithm,Optimization,我注册了一个网络编程c,里面有几个算法练习。 我提出了一个非常简单的问题如下: 我收到4个数字,它们决定了一个矩形的两个角的坐标,并且必须计算面积。 有一组测试,当第二个角位于第一个角的下方或左侧(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() { whi

我注册了一个网络编程c,里面有几个算法练习。 我提出了一个非常简单的问题如下: 我收到4个数字,它们决定了一个矩形的两个角的坐标,并且必须计算面积。 有一组测试,当第二个角位于第一个角的下方或左侧(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));
    }
}
#包括
#包括
int main()
{
而(1){
int-x1,x2,y1,y2;
scanf(“%d%d%d%d”,&x1,&y1,&x2,&y2);//x1 y1==A,x2 y2==B
如果(x1>x2 | y1>y2)
返回0;
printf(“%d\n”,(x2-x1)*(y2-y1));
}
}
我的问题只是好奇。我用“0052”的时间解决了这个问题,在我前面有3个人已经在“0048”和“0024”中解决了!。 我可以使用哪些优化方法来缩短时间?可能是指针?

一些想法:

  • 您可以使用gcc的
    \uuu内置的
    函数来确保假设条件为false

  • 指针不太可能帮助您改进解决方案

  • scanf()
    可能是最慢的部分。用一个只需要十进制整数的解析器重写它可能会快得多。当前,
    scanf()
    需要解析格式字符串,输入数字可以是八进制、十六进制或十进制。或者可能是无效的输入。等等


  • 不多,但可以尝试声明
    intx1,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);
    }
    
    intx1,x2,y1,y2;,地区
    字符缓冲区[100];
    int main()
    {
    做
    {
    fgets(缓冲区、sizeof(缓冲区)、stdin);
    sprintf(缓冲区,“%d%d%d”、&x1、&y1、&x2和&y2);
    x2-=x1;
    y2-=y1;
    面积=y2*x2;
    printf(“%d\n”,area);//或者puts(itoa(area));
    
    }while((0)我尝试了,但当我这样做时,我得到的时间是006,这比我的最佳时间要多。您可能会发现生成的机器代码是相同的。查看机器代码(尤其是在编译器试图优化的情况下)除了担心没有单位的四位时间数字所造成的伤害之外,没有其他伤害。(观点:即使在微基准测试中,也不要担心5秒以下的计时。进行基准测试时要有时间限制,而不是循环计数。)我应该如何在我的程序中使用uu builtin_expect()?我从未使用过它,也不知道如何应用它。@Raxkin:我通常通过辅助宏
    可能(x)
    不可能(x)使用它们
    :这个问题完全是胡说八道。它是对程序员无法控制的标准I/O语句进行计时。(其他语句的时间——两个基本C表达式,没有什么可优化的——相比之下少得可笑。)
    scanf
    printf
    (每次刷新一次)将会非常(非常)多比其他任何东西都慢。为等待键盘输入的函数计时都是胡说八道。你在给打字员计时。这是一个在线竞赛,你不编译自己的代码并提交二进制文件。这对我来说是什么,我没有提交任何二进制文件。你是在建议OP使用编译器优化标志。这就是为什么我说你不使用c提交前请先编译代码。在线评委会进行编译和测试,您只需编写代码。OPs问题中没有任何关于如何编译代码的限制