小知識+碎東西

/**
    今晚還是寫點常用或不常用的小知識點吧,一看到算法兩個字就頭疼

    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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章