重复重复

  1. XOR按位异或运算,比如4跟6是100和110,按位异或后为101,即为5;该运算有个特点,a XOR b=c,a XOR c=b;
  2. 求十进制转换为二进制后1的个数,while(i) { if(i & 1)  count ++; i = i >> 1; }
  3. 数轴原理求最大值:#define max(a,b)  (((a)+(b)+abs((a)-(b)))/2)
  4. 查找在一个有序序列b中小于a的方法,用lower_bound(b,b+n,a)---返回大于或等于a的第一个位置,否则返回end位置,upper_bound(b,b+n,a)返回的是最后一个大于或等于a的位置,否则返回last,binary_search(b,b+n,a)是寻找是否有a这个值,有则返回true。如果是STL,则可以直接用,比如s是set类型的,s.lower_bound(p),里面的p就是你定义的类型,找到不大于p的第一个,找的话也会按照你定义的<找;
  5. 计算是i的几次方是2的64次方:top= ceil(64 * log(2) / log(i)) - 1;
  6. 有时候数太大,有个优化的方法是先化作log,再通过exp转化回去:UVA10883,比如组合数转化为对数:
  7. 11889UVA 已知a,c . 求b使a,b的最小公倍数为c,b一定是c/a的多少倍
  8. 一个数的因数的数目等于所有质因子的个数的乘积:1000有3个2,3个5质因子,即可以分解为8和125两个完全平方数,8有4个约数(1,2,4,8),125有4个约数(1,5,25,125),4*4=16就是1000的约数个数
  9. 11076是一道数学题,给你一个数,求它的k次方后的前三位数和后三位数
    方法:前三位用double保存起来,然后乘以1000可得,后三位取余,比如求123456的2次方,1.23456*1.23456 = 1.5241383936,然后就1.52*1000就是前三位,这样可以避免多位数字的出栈,后三位则是每次对1000取余,就剩下456*456=40936;即936位最后三位

  10. 求约瑟夫环的输出顺序时:这一次淘汰的号数 = (上一个淘汰的人+走的步数-1)%剩下的人数。

  11. string转换成数字:

    1 string str1
    2 stringstream ss1(str1);///用stringstream可以用来转换字符串与数字(int,double都可以)
    3 double t;
    4 ss1 >> t;
    5 printf("%.2lf
    ",t);
  12. 数字转换成string:
    1 int i;
    2 cin>>i;
    3 ostringstream ost;
    4 ost << i;
    5 string temp(ost.str());
    6 cout << temp << endl;
  13. printf("%*s%s%*s",5,"","12345",5,"");神坑题目啊,%*s控制空格数,表示前边和后边分别有5个空格;
  14. 卡特兰数组:1, 2, 5, 14, 42, 132, 429,遇见这几个数时就可以猜测一下是卡特兰数,关键是记得住。。。。。其实还是记公式,现场推公式更实际;
  15. MLE的计算
  16. 对于2元数组,数组初始化的时候需要进行二层循环进行,如果用memset可能超时,而且我记得之前看过的博客说,memset初始二元数组可能成功不了,所以尽量还是直接二层循环;
  17. q.push(make_pair(i,j)) 比 q.push(node(i,j))的时间快,以后再遇见类似这种结点的,最好不要用结构体了,具体就是:
    1  pair<int ,int > a = q.front();
    2 int x = a.first + dir[i][0];
    3 int y = a.second + dir[i][1];

     

原文地址:https://www.cnblogs.com/ACMERY/p/4332870.html