小知识+碎东西

/**
    今晚还是写点常用或不常用的小知识点吧,一看到算法两个字就头疼

    1、 <math.h>
        给出两直角边a, b
        hypot(a, b);            //返回斜边长度

    2、 scanf("%*d%*d");        //接收两个无用数字

    3、 经纬度处理
      设地球上某点经度为 l,纬度为 p
        则这点空间坐标为
        x = cos(p) * cos(l);
        y = cos(p) * sin(l);
        z = sin(p);
      设这两点坐标为(x1, y1, z1) , (x2, y2, z2);
        则它们的夹角为
        A = acos(x1*x2 + y1*y2 + z1*z2);
        球面距离为
        L = A * R;  //R为地球半径;

    4、 计算几何多边形面积 = 每条边向量的叉乘之和绝对值除以二
        float Area = 0.5 * ((x1*y2 - y1*x2) + (x2*y3 - y2*x3) + ... + (xn*y1 - yn*x1));
        例如三角形坐标 (x1, y1)  (x2, y2)  (x3, y3)
        Area = 0.5 * ((x1*y2 - y1*x2) + (x2*y3 - y2*y3) + (x3*y1 - y3*x1));

    5、 数学技巧
      设一无限循环小数 0.abcdefg...
      设不循环部分长度为 c, 循环部分长度为 k
      如:0.abcdefg... c(abcd) = 4, k(efg) = 3 //不循环部分为abcd 循环部分为efg -> 0.abcdefgefgefg...

      设这个无限循环小数可化为两个数的商 a / b
      则 10^(k+c) * (a/b) = abcdefg.efg...
         10^(c) * (a/b) = abcd.efg...
      两式想减得
         10^(k+c) * (a/b) - 10^(c) * (a/b) = abcdefg - abcd;
      设abcdefg = all, abcd = num;

      则 a/b = (all - num) / (10^c + (10^k-1))
      // POJ 1930

    6、 数论中一个基本结论
      如果一个数 奇数位的数字之和 与 偶数位数字之和 的差能被11整除,
      那么这个数可被11 整除,用于求大数能否整除11
      如 11715 奇数位数字之和为1+7+5 = 13 偶数位为 1+1 = 2  13 - 2 = 11,则11715能被11整除

    7、 图论小知识
      设邻接矩阵中两点相连为1
      把邻接矩阵k次方后 矩阵中的每个元素(i, j), 表示的是顶点i 到 j 的长度为k 的路径条数。

    8、 随机打乱数组中元素
       #include <algorithm>
       //数组b[n]
       random_shuffle(b, b+n);

    9、 内置函数,在函数左端加一个关键字inline
       inline int max()
       {

       }
       用于频繁使用的函数,增加效率,在编译时将所调用函数代码嵌入主函数中,增加主函数长度

    10、 字符串小知识
       strupr(小写转大写);
       strlwr(大写转小写);

    11、 用文件代替标准输入输出
       freopen("F:\\OUT.TXT", "w", stdout);
       freopen("F:\\IN.TXT", "r", stdin);
       放在主函数中即可

    12、用 pow() 函数转成整数时一定要加个定点小数
       m = (int)(pow(2.0, double(n)) + x) //(x 大于 0 小于 1)

    13、 #include <math.h>
         (double)ceil(double); //取上整
         (double)floor(double);//取下整
         sqrt(double);         //求根

    14、判断 n 奇偶  (n&1) == 1 为奇 0 为偶
        n >>= 1 // 右移一位相当于除二
        n <<= 1 // 左移一位相当于乘二
        //更快

    15、 #include <string.h>

         strchr(str, ch) //ch字符在str中首次出现的位置

         a[6] = "abcde";
         strncpy(b, a+i, j);
         b[j-i+1] = '\0';
         //将a字符串中从i 到 j 的字符复制到b 中

         strstr(a, b);
         //判断b是否为a 中的子串为NULL 时不是,反之是

         strrev(a);
         //将a 中字符倒置

         strcat(a, b);
         //将b 连接到a 后

    16、 在windows 下ctrl + Z结束,比赛时候是linux下 按 ctrl + D 结束

    17、 数学中的PI = 3.1415926..
         #define PI acos(-1.0)

    18、 输出程序运行时间
         #include <time.h>
         printf("Time used = %.2lf\n", (double)clock()/CLOCKS_PER_SEC);

    19、 int最大最小
         #include <limits.h>

         INT_MAX  INT_MIN

         //不建议用,一般 #define int_max = 0x3f3f3f3f

    20、 用sscanf(" ", " ", & ); 分离字符串中的数值
         如:num[10] = "123";
             sscanf(num, "%d", &a);
             则 a = 123;

             分离"1989.07.15"中的数值
             sscanf("1989.07.15", "%d.%d.%d", &a, &b, &c)
             a = 1989; b = 7; c = 15;

    //累死了 累死了 睡觉了 晚安
*/

收藏于 2012-01-10

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值