杂记

1.进制转换

void conversion(char s1[],char s2[],long d1, long d2)

{

      long i,j,t,num;

     char c;

     num = 0;

     for(i = 0; s1[i] != '\0'; i++)

     {

           if(s1[i] <= '9' && s1[i] >= '0')

                t = s1[i] - '0';

           else

                t = s1[i] - 'A' + 10;

           num = num * d1 + t;

     }

     i = 0;

     while(1)

     {

            t = num % d2;

            if(t <= 9)  

                 s2[i] = t + '0';

           else

                 s2[i] = t + 'A' - 10;

          num /= d2;

          if(num == 0)

                 break;

          i++;

     }

    for (j = 0; i < i / 2; j++)//反向输出

    {

          c = s2[j];

          s2[j] = s[i - j];

          s2[i - j] = c;

    }

    s2[i + 1] = '\0';

}

2.最大公约数和最小公倍数

//辗转相除法

int a,b,c,m,t; 

if(a<b) { t=a; a=b; b=t; }

m=a*b;

c=a%b;

while(c!=0) { a=b; b=c; c=a%b; }

printf("最大公约数是:\n%d\n",b);

printf("最小公倍数是:\n%d\n",m/b); 

3.快排

//排序上届通常为0, 排序下届通常为数组元素个数, int b[]被排序元素

void quicksort(int l, int r, int b[])

{    

      int i, j, x;  

      if (l >= r)

          return;    

       i = l; j = r; x = b[i];    

      while (i != j)    

      {        

            while (b[j] > x && j > i)

                    j--;      

             if (i < j)        

             {            

                    b[i] = b[j];  

                    i++;        

             }        

             while (b[i] < x && j > i)

                     i++;        

              if (i < j)        

              {

                     b[j] = b[i];  

                     j--;        

               }  

       }    

       b[i] = x;  

       quicksort (l, j-1, b);  

       quicksort (i+1, r, b);

}

4.判断素数

int comp (int n)

{    

        int i, flag = 1;    

        for (i = 2; i <= sqrt(n); i++)        

              if (n % i == 0) { flag = 0;  break; }  

        if (flag == 1)

            return 1;    

        else return 0;

}

5.二分查找

int search_bin (int *t, int k)

{    

        int low = 1, high = 10, mid;    

       While (low <= high)    

       {

              mid = (low + high) / 2;        

              if (k == t[mid]) return mid;        

             else if (k < t[mid]) high = mid - 1;        

             else low = mid + 1;    

        }    

        return -1;

}

6.快速幂

a * b% m = (a % m) * (b % m) % m

ab相乘后再取模等于ab分别先取模后相乘再取模。    

private static int quickcount(int a, int b)

{        

          int s = 1;        

         while (b > 0)

        {

               if (b % 2 == 1)

               {                

                        s = s % 1000;

                        a = a % 1000;

                        s = s * a;          

               }            

          a = a % 1000;            

          a = a * a;            

          b = b >> 1;        

     }      

return s % 1000;

}

7.旋转矩阵

void turn_90()

{

        for(int i=0; i<n; i++)

            for(int j=0; j<n; j++)

                 a90[i][j]=a[n-1-j][i];

}

void turn_180()

{

        for(int i=0; i<n; i++)

            for(int j=0; j<n; j++)

                 a180[i][j]=a[n-1-i][n-j-1];

}

void turn_270()

{

        for(int i=0; i<n; i++)

             for(int j=0; j<n; j++)

                 a270[i][j]=a[j][n-1-i];

}

 

#define MS(x, y) memset(x, y, sizeof(x))

//把数组给初始化成0或者-1

 

#define ls o<<1

//左移1位,左移是*2

#define rs o<<1|1

//右移,并且变成奇数,右移是/2

 

const int N = 55, M = N * N, Z = 1e9 + 7,inf = 0x3f3f3f3f;

N是做题常用到的数组下标最大值,M是N*N可以用来开二维数组

Z用来取模,因为有些数字特别大,要输出的话就要对一个很大的质数求余数

inf是int最大值,相当于无穷大的意思,一般用来当min的初始值。

 

a =0010(0x02) a >>= 1; (a 右移1位并把右移的结果重新赋值给a) 此时a= 0001(0x01);

a <<= 1;(a左移1位并把左移的结果重新赋值给a) 此时 a = 0100(0x04);

a &= 0x01;( a与0x01 按位与,并把按位与的结果重新赋值给a)。此时a = 0x0;

a |= 0x01;( a与0x01 按位或,并把按位或的结果重新赋值给a)。此时a = 0011(0x03);

a ^= 0x01;( a与0x01 按位异或,并把按位异或的结果重新赋值给a)。此时a = 0x03;

(异或的意思就是,该位均为相同的则该位结果为0,该位均为不同的则该位结果为1)

<<:移运算符,num << 1,相当于num乘以2

>>:右移运算符,num >> 1,相当于num除以2

>>>:无符号右移,忽略符号位,空位都以0补齐
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值