• 短代码.求2点之距离


    问题:
    输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离。
    输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开。
    对于每组输入数据,输出一行,结果保留两位小数。
    比如,输入:
    0 0 0 1
    0
     1 1 
    0
    那么输出:
    1.00
    1.41

    题目很简单,甚至有点无聊了。
    #include <math.h>
    int main()
    {
       
    float
     a,b,c,d;
       
    while(scanf("%f%f%f%f",&a,&b,&c,&d
    )==4)
        {
            printf(
    "%.2f\n",sqrt((a-c)*(a-c)+(b-d)*(b
    -d)));
        }
        return 0;
    }
    好吧,第一个看上去已经挺短的了。好吧,换编译器,用c的编译器,gcc,vc也可以(存.c文件)。这样可以利用一些c的'好处',至少对缩短代码来说是好处。
    #include <math.h>
    main()
    {
       
    float
     a,b,c,d;
       
    while(scanf("%f%f%f%f",&a,&b,&c,&d
    )==4)
            printf(
    "%.2f\n",sqrt((a-c)*(a-c)+(b-d)*(b
    -d)));
    }
    默认函数返回类型为int,返回值?我管它是多少呢,短就行了。去掉不必要的空白。
    #include<math.h>
    main(){float a,b,c,d;while(scanf("%f%f%f%f",&a,&b,&c,&d)==4)printf("%.2f\n",sqrt((a-c)*(a-c)+(b-d)*(b-d)));}
    125
    可惜,怎么还得留着math.h,否则sqrt未定义的情况c语言认为它是一个返回int的函数,于是链接时没能链接到我们想要的函数。
    继续缩短,那段差的平方很扎眼,那么多括号。scanf的返回值比3大和等于4也差不多了,总不至于要求4个输入,却得到5个吧。也改了
    #include<math.h>
    main(){float a,b,c,d;while(scanf("%f%f%f%f",&a,&b,&c,&d)>3)a-=c,b-=d,printf("%.2f\n",sqrt(a*a+b*b));}
    118
    while和for的长度其实是一样的,虽然for比while少2个字母,但for语句要多2个分号。算是打平,不过其实不然。注意当循环体有多句的时候,把最后一句放到for的末尾,还可以节约一个逗号- -
    #include<math.h>
    main(){float a,b,c,d;for(;scanf("%f%f%f%f",&a,&b,&c,&d)>3;printf("%.2f\n",sqrt(a*a+b*b)))a-=c,b-=d;}
    117
    那个包含文件真讨厌,而且非得换行。要是能去掉它就好了。既然我只是为了要sqrt,为什么不自己声明一下呢。
    double sqrt();main(){float a,b,c,d;for(;scanf("%f%f%f%f",&a,&b,&c,&d)>3;printf("%.2f\n",sqrt(a*a+b*b)))a-=c,b-=d;}
    114
    嗯,看来确实短了一些。double和float能通用吗?也许不能吧,要不试试?
    float sqrt();main(){float a,b,c,d;for(;scanf("%f%f%f%f",&a,&b,&c,&d)>3;printf("%.2f\n",sqrt(a*a+b*b)))a-=c,b-=d;}
    113
    居然可以,输出结果正确。奇怪啊...反编译一下。哦。原来作为参数,float也被转为double类型压栈。这个可能不太保险,天知道是不是所有机器都压double呢- -。不过好在这里能凑合,那x86的估计也都能。
    啊呀,我傻啊,为什么有2个float在代码里!怎么不把它们合并了?
    main(){float sqrt(),a,b,c,d;for(;scanf("%f%f%f%f",&a,&b,&c,&d)>3;printf("%.2f\n",sqrt(a*a+b*b)))a-=c,b-=d;}
    107
    农夫三拳想出了一个方法,他提示到“-1的二进制”。哦!对了,当scanf遇到输入结束时返回EOF,那就是-1。-1的二进制为全1,也就是说反码为0。好吧,感谢农夫三拳让我再缩短一个字节,让>3见鬼去吧~
    main(){float sqrt(),a,b,c,d;for(;~scanf("%f%f%f%f",&a,&b,&c,&d);printf("%.2f\n",sqrt(a*a+b*b)))a-=c,b-=d;}
    106
    结束...
    如果您有更bt的想法能缩短代码,请别忘了告诉我~
  • 相关阅读:
    Spring
    vue实现大文件上传下载
    javascript实现大文件上传下载
    js实现大文件上传下载
    php实现大文件上传下载
    jsp实现大文件上传下载
    java实现大文件上传下载
    java实现大文件上传功能
    百度ueditor编辑器 复制word里面带图文的文章,图片可以直接显示
    百度ueditor 复制word里面带图文的文章,图片可以直接显示
  • 原文地址:https://www.cnblogs.com/kaikai/p/817889.html
Copyright © 2020-2023  润新知